Merge "Import translations. DO NOT MERGE" into qt-r1-dev
diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java
index c45b8ed..3e995b6 100644
--- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java
+++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java
@@ -48,7 +48,8 @@
return pulseOnNotificationEnabled(user)
|| pulseOnLongPressEnabled(user)
|| alwaysOnEnabled(user)
- || wakeScreenGestureEnabled(user)
+ || wakeLockScreenGestureEnabled(user)
+ || wakeDisplayGestureEnabled(user)
|| pickupGestureEnabled(user)
|| tapGestureEnabled(user)
|| doubleTapGestureEnabled(user);
@@ -105,8 +106,14 @@
}
/** {@hide} */
- public boolean wakeScreenGestureEnabled(int user) {
- return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, user)
+ public boolean wakeLockScreenGestureEnabled(int user) {
+ return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, user)
+ && wakeScreenGestureAvailable();
+ }
+
+ /** {@hide} */
+ public boolean wakeDisplayGestureEnabled(int user) {
+ return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, user)
&& wakeScreenGestureAvailable();
}
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index 9bcdcee..09e09e9 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -81,7 +81,7 @@
* not be used if the devices has a DeviceConfig profile pushed to it that contains a value for
* this key.
*/
- private static final String USAP_POOL_ENABLED_DEFAULT = "true";
+ private static final String USAP_POOL_ENABLED_DEFAULT = "false";
/**
* The name of the socket used to communicate with the primary zygote.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 83e636b..e95e6e0 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -88,6 +88,7 @@
import android.util.ArraySet;
import android.util.Log;
import android.util.MemoryIntArray;
+import android.view.Display;
import android.view.inputmethod.InputMethodSystemProperty;
import com.android.internal.annotations.GuardedBy;
@@ -4073,7 +4074,7 @@
* preference, this rotation value will be used. Must be one of the
* {@link android.view.Surface#ROTATION_0 Surface rotation constants}.
*
- * @see android.view.Display#getRotation
+ * @see Display#getRotation
*/
public static final String USER_ROTATION = "user_rotation";
@@ -7733,12 +7734,21 @@
private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
/**
- * Gesture that wakes up the display, showing the ambient version of the status bar.
+ * Gesture that wakes up the display, showing some version of the lock screen.
* @hide
*/
- public static final String DOZE_WAKE_SCREEN_GESTURE = "doze_wake_screen_gesture";
+ public static final String DOZE_WAKE_LOCK_SCREEN_GESTURE = "doze_wake_screen_gesture";
- private static final Validator DOZE_WAKE_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
+ private static final Validator DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
+
+ /**
+ * Gesture that wakes up the display, toggling between {@link Display.STATE_OFF} and
+ * {@link Display.STATE_DOZE}.
+ * @hide
+ */
+ public static final String DOZE_WAKE_DISPLAY_GESTURE = "doze_wake_display_gesture";
+
+ private static final Validator DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR;
/**
* Gesture that skips media.
@@ -8964,7 +8974,8 @@
DOZE_PICK_UP_GESTURE,
DOZE_DOUBLE_TAP_GESTURE,
DOZE_TAP_SCREEN_GESTURE,
- DOZE_WAKE_SCREEN_GESTURE,
+ DOZE_WAKE_LOCK_SCREEN_GESTURE,
+ DOZE_WAKE_DISPLAY_GESTURE,
NFC_PAYMENT_DEFAULT_COMPONENT,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
FACE_UNLOCK_KEYGUARD_ENABLED,
@@ -9136,7 +9147,8 @@
VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR);
VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR);
VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR);
- VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR);
+ VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR);
+ VALIDATORS.put(DOZE_WAKE_DISPLAY_GESTURE, DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR);
VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR);
VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR);
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index cb64ab1..17f07b5 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -21,6 +21,7 @@
import android.annotation.UnsupportedAppUsage;
import android.content.res.CompatibilityInfo.Translator;
import android.graphics.Canvas;
+import android.graphics.ColorSpace;
import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.RecordingCanvas;
@@ -80,7 +81,8 @@
private static native long nativeGetNextFrameNumber(long nativeObject);
private static native int nativeSetScalingMode(long nativeObject, int scalingMode);
private static native int nativeForceScopedDisconnect(long nativeObject);
- private static native int nativeAttachAndQueueBuffer(long nativeObject, GraphicBuffer buffer);
+ private static native int nativeAttachAndQueueBufferWithColorSpace(long nativeObject,
+ GraphicBuffer buffer, int colorSpaceId);
private static native int nativeSetSharedBufferModeEnabled(long nativeObject, boolean enabled);
private static native int nativeSetAutoRefreshEnabled(long nativeObject, boolean enabled);
@@ -699,18 +701,35 @@
}
/**
+ * Transfer ownership of buffer with a color space and present it on the Surface.
+ * The supported color spaces are SRGB and Display P3, other color spaces will be
+ * treated as SRGB.
+ * @hide
+ */
+ public void attachAndQueueBufferWithColorSpace(GraphicBuffer buffer, ColorSpace colorSpace) {
+ synchronized (mLock) {
+ checkNotReleasedLocked();
+ if (colorSpace == null) {
+ colorSpace = ColorSpace.get(ColorSpace.Named.SRGB);
+ }
+ int err = nativeAttachAndQueueBufferWithColorSpace(mNativeObject, buffer,
+ colorSpace.getId());
+ if (err != 0) {
+ throw new RuntimeException(
+ "Failed to attach and queue buffer to Surface (bad object?), "
+ + "native error: " + err);
+ }
+ }
+ }
+
+ /**
+ * Deprecated, use attachAndQueueBufferWithColorSpace instead.
* Transfer ownership of buffer and present it on the Surface.
+ * The color space of the buffer is treated as SRGB.
* @hide
*/
public void attachAndQueueBuffer(GraphicBuffer buffer) {
- synchronized (mLock) {
- checkNotReleasedLocked();
- int err = nativeAttachAndQueueBuffer(mNativeObject, buffer);
- if (err != 0) {
- throw new RuntimeException(
- "Failed to attach and queue buffer to Surface (bad object?)");
- }
- }
+ attachAndQueueBufferWithColorSpace(buffer, ColorSpace.get(ColorSpace.Named.SRGB));
}
/**
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 63e1485..3c045f4 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -1866,7 +1866,8 @@
final ScreenshotGraphicBuffer buffer = screenshotToBuffer(display, sourceCrop, width,
height, useIdentityTransform, rotation);
try {
- consumer.attachAndQueueBuffer(buffer.getGraphicBuffer());
+ consumer.attachAndQueueBufferWithColorSpace(buffer.getGraphicBuffer(),
+ buffer.getColorSpace());
} catch (RuntimeException e) {
Log.w(TAG, "Failed to take screenshot - " + e.getMessage());
}
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index afe7954..6f4f337 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -84,6 +84,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
+import android.view.ViewRootImpl;
import android.view.ViewStub;
import android.view.ViewTreeObserver;
import android.view.Window;
@@ -1150,8 +1151,15 @@
navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge,
0 /* sideInset */, animate && !disallowAnimate,
mForceWindowDrawsBarBackgrounds);
+ boolean oldDrawLegacy = mDrawLegacyNavigationBarBackground;
mDrawLegacyNavigationBarBackground = mNavigationColorViewState.visible
&& (mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0;
+ if (oldDrawLegacy != mDrawLegacyNavigationBarBackground) {
+ ViewRootImpl vri = getViewRootImpl();
+ if (vri != null) {
+ vri.requestInvalidateRootRenderNode();
+ }
+ }
boolean statusBarNeedsRightInset = navBarToRightEdge
&& mNavigationColorViewState.present;
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index ccadc7d..ff14a2a 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -75,6 +75,24 @@
jfieldID bottom;
} gRectClassInfo;
+class JNamedColorSpace {
+public:
+ // ColorSpace.Named.SRGB.ordinal() = 0;
+ static constexpr jint SRGB = 0;
+
+ // ColorSpace.Named.DISPLAY_P3.ordinal() = 7;
+ static constexpr jint DISPLAY_P3 = 7;
+};
+
+constexpr ui::Dataspace fromNamedColorSpaceValueToDataspace(const jint colorSpace) {
+ switch (colorSpace) {
+ case JNamedColorSpace::DISPLAY_P3:
+ return ui::Dataspace::DISPLAY_P3;
+ default:
+ return ui::Dataspace::V0_SRGB;
+ }
+}
+
// ----------------------------------------------------------------------------
// this is just a pointer we use to pass to inc/decStrong
@@ -425,11 +443,12 @@
return surface->disconnect(-1, IGraphicBufferProducer::DisconnectMode::AllLocal);
}
-static jint nativeAttachAndQueueBuffer(JNIEnv *env, jclass clazz, jlong nativeObject,
- jobject graphicBuffer) {
+static jint nativeAttachAndQueueBufferWithColorSpace(JNIEnv *env, jclass clazz, jlong nativeObject,
+ jobject graphicBuffer, jint colorSpaceId) {
Surface* surface = reinterpret_cast<Surface*>(nativeObject);
sp<GraphicBuffer> bp = graphicBufferForJavaObject(env, graphicBuffer);
- int err = Surface::attachAndQueueBuffer(surface, bp);
+ int err = Surface::attachAndQueueBufferWithDataspace(surface, bp,
+ fromNamedColorSpaceValueToDataspace(colorSpaceId));
return err;
}
@@ -531,7 +550,8 @@
{"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber },
{"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode },
{"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect},
- {"nativeAttachAndQueueBuffer", "(JLandroid/graphics/GraphicBuffer;)I", (void*)nativeAttachAndQueueBuffer},
+ {"nativeAttachAndQueueBufferWithColorSpace", "(JLandroid/graphics/GraphicBuffer;I)I",
+ (void*)nativeAttachAndQueueBufferWithColorSpace},
{"nativeSetSharedBufferModeEnabled", "(JZ)I", (void*)nativeSetSharedBufferModeEnabled},
{"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled},
diff --git a/packages/SystemUI/res/anim/lock_in.xml b/packages/SystemUI/res/anim/lock_in.xml
deleted file mode 100644
index c7014e8..0000000
--- a/packages/SystemUI/res/anim/lock_in.xml
+++ /dev/null
@@ -1,227 +0,0 @@
-<!-- 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.
--->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
- <aapt:attr name="android:drawable">
- <vector android:height="42dp" android:width="32dp" android:viewportHeight="42"
- android:viewportWidth="32">
- <group android:name="_R_G">
- <group android:name="_R_G_L_2_G" android:translateX="1.6669999999999998"
- android:translateY="11.992999999999999" android:pivotX="14.333"
- android:pivotY="13" android:scaleX="0" android:scaleY="0">
- <path android:name="_R_G_L_2_G_D_0_P_0" android:strokeColor="#ffffff"
- android:strokeLineCap="round" android:strokeLineJoin="round"
- android:strokeWidth="2" android:strokeAlpha="1"
- android:pathData=" M22.33 21 C22.33,21 6.33,21 6.33,21 C5.6,21 5,20.4 5,19.67 C5,19.67 5,6.33 5,6.33 C5,5.6 5.6,5 6.33,5 C6.33,5 22.33,5 22.33,5 C23.07,5 23.67,5.6 23.67,6.33 C23.67,6.33 23.67,19.67 23.67,19.67 C23.67,20.4 23.07,21 22.33,21c "/>
- </group>
- <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="1.6669999999999998"
- android:translateY="11.992999999999999" android:pivotX="14.333"
- android:pivotY="13" android:scaleX="0" android:scaleY="0">
- <group android:name="_R_G_L_1_G" android:translateX="11.583"
- android:translateY="10.257">
- <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff"
- android:fillAlpha="1" android:fillType="nonZero"
- android:pathData=" M2.75 0.25 C4.13,0.25 5.25,1.37 5.25,2.75 C5.25,4.13 4.13,5.25 2.75,5.25 C1.37,5.25 0.25,4.13 0.25,2.75 C0.25,1.37 1.37,0.25 2.75,0.25c "/>
- </group>
- </group>
- <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="1.6669999999999998"
- android:translateY="11.992999999999999" android:pivotX="14.333"
- android:pivotY="13" android:scaleX="0" android:scaleY="0">
- <group android:name="_R_G_L_0_G_T_1" android:translateX="14.333"
- android:translateY="3.172">
- <group android:name="_R_G_L_0_G" android:translateX="-9.667"
- android:translateY="-9.667">
- <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff"
- android:strokeLineCap="round" android:strokeLineJoin="round"
- android:strokeWidth="2" android:strokeAlpha="1"
- android:trimPathStart="0.14" android:trimPathEnd="0.89"
- android:trimPathOffset="0"
- android:pathData=" M14.33 14.33 C14.33,14.33 14.33,9.67 14.33,9.67 C14.33,7.09 12.24,5 9.67,5 C7.09,5 5,7.09 5,9.67 C5,9.67 5,14.33 5,14.33 "/>
- </group>
- </group>
- </group>
- </group>
- <group android:name="time_group"/>
- </vector>
- </aapt:attr>
- <target android:name="_R_G_L_2_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="scaleX" android:duration="233"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
- android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="233"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
- android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleX" android:duration="117"
- android:startOffset="233" android:valueFrom="1.02"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="117"
- android:startOffset="233" android:valueFrom="1.02"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_1_G_N_4_T_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="scaleX" android:duration="233"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
- android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="233"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
- android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleX" android:duration="117"
- android:startOffset="233" android:valueFrom="1.02"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="117"
- android:startOffset="233" android:valueFrom="1.02"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="trimPathStart" android:duration="50"
- android:startOffset="0" android:valueFrom="0.14"
- android:valueTo="0.14" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator
- android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="trimPathStart" android:duration="67"
- android:startOffset="50" android:valueFrom="0.14"
- android:valueTo="0" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator
- android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="trimPathEnd" android:duration="50"
- android:startOffset="0" android:valueFrom="0.89"
- android:valueTo="0.89" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator
- android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="trimPathEnd" android:duration="67"
- android:startOffset="50" android:valueFrom="0.89"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator
- android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_T_1">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="translateY" android:duration="150"
- android:startOffset="0" android:valueFrom="3.172"
- android:valueTo="0.34" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.23,-0.46 0.2,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_N_4_T_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="scaleX" android:duration="233"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
- android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="233"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1.02"
- android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleX" android:duration="117"
- android:startOffset="233" android:valueFrom="1.02"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="117"
- android:startOffset="233" android:valueFrom="1.02"
- android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="translateX" android:duration="717"
- android:startOffset="0" android:valueFrom="0" android:valueTo="1"
- android:valueType="floatType"/>
- </set>
- </aapt:attr>
- </target>
-</animated-vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/anim/lock_in_circular.xml b/packages/SystemUI/res/anim/lock_in_circular.xml
deleted file mode 100644
index d1e98db..0000000
--- a/packages/SystemUI/res/anim/lock_in_circular.xml
+++ /dev/null
@@ -1,327 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
- xmlns:android="http://schemas.android.com/apk/res/android" >
-
- <aapt:attr name="android:drawable" >
- <vector
- android:height="32dp"
- android:viewportHeight="32"
- android:viewportWidth="32"
- android:width="32dp" >
- <group android:name="_R_G" >
- <group
- android:name="_R_G_L_2_G"
- android:pivotX="9.583"
- android:pivotY="8.916"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="6.416"
- android:translateY="10.416999999999998" >
- <path
- android:name="_R_G_L_2_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c " />
- </group>
- <group
- android:name="_R_G_L_1_G_N_3_T_0"
- android:pivotX="9.583"
- android:pivotY="8.916"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="6.416"
- android:translateY="10.416999999999998" >
- <group
- android:name="_R_G_L_1_G"
- android:translateX="7.334"
- android:translateY="5.333" >
- <path
- android:name="_R_G_L_1_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c " />
- <path
- android:name="_R_G_L_1_G_D_1_P_0"
- android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 "
- android:strokeAlpha="1"
- android:strokeColor="#ffffff"
- android:strokeLineCap="round"
- android:strokeLineJoin="round"
- android:strokeWidth="1.5" />
- </group>
- </group>
- <group
- android:name="_R_G_L_0_G_N_3_T_0"
- android:pivotX="9.583"
- android:pivotY="8.916"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="6.416"
- android:translateY="10.416999999999998" >
- <group
- android:name="_R_G_L_0_G_T_1"
- android:translateX="9.583"
- android:translateY="-0.861" >
- <group
- android:name="_R_G_L_0_G"
- android:translateX="-8.083"
- android:translateY="-8.173" >
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:pathData=" M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 "
- android:strokeAlpha="1"
- android:strokeColor="#ffffff"
- android:strokeLineCap="round"
- android:strokeLineJoin="round"
- android:strokeWidth="1.5"
- android:trimPathEnd="0.9"
- android:trimPathOffset="0"
- android:trimPathStart="0.15" />
- </group>
- </group>
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-
- <target android:name="_R_G_L_2_G" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_1_G_N_3_T_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="50"
- android:propertyName="trimPathStart"
- android:startOffset="0"
- android:valueFrom="0.15"
- android:valueTo="0.15"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="67"
- android:propertyName="trimPathStart"
- android:startOffset="50"
- android:valueFrom="0.15"
- android:valueTo="0"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="50"
- android:propertyName="trimPathEnd"
- android:startOffset="0"
- android:valueFrom="0.9"
- android:valueTo="0.9"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="67"
- android:propertyName="trimPathEnd"
- android:startOffset="50"
- android:valueFrom="0.9"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_T_1" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="150"
- android:pathData="M 9.583,-0.861C 9.583,-1.32784640645981 9.583,-3.19515359354019 9.583,-3.662"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="0" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_N_3_T_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="717"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
-
-</animated-vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/anim/lock_in_filled.xml b/packages/SystemUI/res/anim/lock_in_filled.xml
deleted file mode 100644
index 4cde38d..0000000
--- a/packages/SystemUI/res/anim/lock_in_filled.xml
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
- xmlns:android="http://schemas.android.com/apk/res/android" >
-
- <aapt:attr name="android:drawable" >
- <vector
- android:height="32dp"
- android:viewportHeight="32"
- android:viewportWidth="32"
- android:width="32dp" >
- <group android:name="_R_G" >
- <group
- android:name="_R_G_L_1_G"
- android:pivotX="10.917"
- android:pivotY="9.583"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="5.083"
- android:translateY="10.417" >
- <path
- android:name="_R_G_L_1_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " />
- </group>
- <group
- android:name="_R_G_L_0_G_N_2_T_0"
- android:pivotX="10.917"
- android:pivotY="9.583"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="5.083"
- android:translateY="10.417" >
- <group
- android:name="_R_G_L_0_G_T_1"
- android:translateX="10.917"
- android:translateY="0.579" >
- <group
- android:name="_R_G_L_0_G"
- android:translateX="-9"
- android:translateY="-9" >
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:pathData=" M13 13 C13,13 13,9 13,9 C13,6.79 11.21,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 "
- android:strokeAlpha="1"
- android:strokeColor="#ffffff"
- android:strokeLineCap="round"
- android:strokeLineJoin="round"
- android:strokeWidth="2" />
- </group>
- </group>
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-
- <target android:name="_R_G_L_1_G" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_T_1" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="150"
- android:pathData="M 10.917,0.579C 10.917,-0.14248990631104008 10.917,-3.02851009368896 10.917,-3.75"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="0" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_N_2_T_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="717"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
-
-</animated-vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/anim/lock_in_rounded.xml b/packages/SystemUI/res/anim/lock_in_rounded.xml
deleted file mode 100644
index 7c8cf9d..0000000
--- a/packages/SystemUI/res/anim/lock_in_rounded.xml
+++ /dev/null
@@ -1,336 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
- xmlns:android="http://schemas.android.com/apk/res/android" >
-
- <aapt:attr name="android:drawable" >
- <vector
- android:height="38dp"
- android:viewportHeight="38"
- android:viewportWidth="32"
- android:width="32dp" >
- <group android:name="_R_G" >
- <group
- android:name="_R_G_L_2_G"
- android:pivotX="14.667"
- android:pivotY="12.667"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="1.3330000000000002"
- android:translateY="10.333" >
- <path
- android:name="_R_G_L_2_G_D_0_P_0"
- android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c "
- android:strokeAlpha="1"
- android:strokeColor="#ffffff"
- android:strokeLineCap="round"
- android:strokeLineJoin="round"
- android:strokeWidth="1.5" />
- </group>
- <group
- android:name="_R_G_L_1_G_N_3_T_0"
- android:pivotX="14.667"
- android:pivotY="12.667"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="1.3330000000000002"
- android:translateY="10.333" >
- <group
- android:name="_R_G_L_1_G"
- android:translateX="12.416"
- android:translateY="10.417" >
- <path
- android:name="_R_G_L_1_G_D_0_P_0"
- android:fillAlpha="1"
- android:fillColor="#ffffff"
- android:fillType="nonZero"
- android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " />
- </group>
- </group>
- <group android:name="_R_G_L_0_G_N_3_T_0_M" >
- <group
- android:name="_R_G_L_0_G_N_3_T_0"
- android:pivotX="14.667"
- android:pivotY="12.667"
- android:scaleX="0"
- android:scaleY="0"
- android:translateX="1.3330000000000002"
- android:translateY="10.333" >
- <group
- android:name="_R_G_L_0_G_T_1"
- android:translateX="14.666"
- android:translateY="3.769" >
- <group
- android:name="_R_G_L_0_G"
- android:translateX="-9.333"
- android:translateY="-9.713" >
- <path
- android:name="_R_G_L_0_G_D_0_P_0"
- android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 "
- android:strokeAlpha="1"
- android:strokeColor="#ffffff"
- android:strokeLineCap="round"
- android:strokeLineJoin="round"
- android:strokeWidth="1.5"
- android:trimPathEnd="0.9"
- android:trimPathOffset="0"
- android:trimPathStart="0.14" />
- </group>
- </group>
- </group>
- </group>
- </group>
- <group android:name="time_group" />
- </vector>
- </aapt:attr>
-
- <target android:name="_R_G_L_2_G" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_1_G_N_3_T_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="50"
- android:propertyName="trimPathStart"
- android:startOffset="0"
- android:valueFrom="0.14"
- android:valueTo="0.14"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="67"
- android:propertyName="trimPathStart"
- android:startOffset="50"
- android:valueFrom="0.14"
- android:valueTo="0"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_0_P_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="50"
- android:propertyName="trimPathEnd"
- android:startOffset="0"
- android:valueFrom="0.9"
- android:valueTo="0.9"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="67"
- android:propertyName="trimPathEnd"
- android:startOffset="50"
- android:valueFrom="0.9"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_T_1" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="150"
- android:pathData="M 14.666,3.769C 14.666,3.18868762874603 14.666,0.8673123712539699 14.666,0.287"
- android:propertyName="translateXY"
- android:propertyXName="translateX"
- android:propertyYName="translateY"
- android:startOffset="0" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_N_3_T_0" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="233"
- android:propertyName="scaleY"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1.025"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.043,0.277 0.44,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleX"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- <objectAnimator
- android:duration="117"
- android:propertyName="scaleY"
- android:startOffset="233"
- android:valueFrom="1.025"
- android:valueTo="1"
- android:valueType="floatType" >
- <aapt:attr name="android:interpolator" >
- <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" />
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_N_3_T_0_M" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="0"
- android:propertyName="scaleX"
- android:startOffset="50"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
- <target android:name="time_group" >
- <aapt:attr name="android:animation" >
- <set android:ordering="together" >
- <objectAnimator
- android:duration="717"
- android:propertyName="translateX"
- android:startOffset="0"
- android:valueFrom="0"
- android:valueTo="1"
- android:valueType="floatType" />
- </set>
- </aapt:attr>
- </target>
-
-</animated-vector>
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index e9eda4f..9a0e9fc 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -19,6 +19,7 @@
import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Rect;
+import android.os.HandlerThread;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.util.Size;
@@ -45,12 +46,27 @@
// We delayed destroy render context that subsequent render requests have chance to cancel it.
// This is to avoid destroying then recreating render context in a very short time.
private static final int DELAY_FINISH_RENDERING = 1000;
+ private HandlerThread mWorker;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mWorker = new HandlerThread(TAG);
+ mWorker.start();
+ }
@Override
public Engine onCreateEngine() {
return new GLEngine(this);
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ mWorker.quitSafely();
+ mWorker = null;
+ }
+
class GLEngine extends Engine implements GLWallpaperRenderer.SurfaceProxy, StateListener {
// Surface is rejected if size below a threshold on some devices (ie. 8px on elfin)
// set min to 64 px (CTS covers this), please refer to ag/4867989 for detail.
@@ -98,13 +114,14 @@
@Override
public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
float yOffsetStep, int xPixelOffset, int yPixelOffset) {
- mRenderer.updateOffsets(xOffset, yOffset);
+ mWorker.getThreadHandler().post(() -> mRenderer.updateOffsets(xOffset, yOffset));
}
@Override
public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
- mRenderer.updateAmbientMode(inAmbientMode,
- (mNeedTransition || animationDuration != 0) ? animationDuration : 0);
+ long duration = mNeedTransition || animationDuration != 0 ? animationDuration : 0;
+ mWorker.getThreadHandler().post(
+ () -> mRenderer.updateAmbientMode(inAmbientMode, duration));
}
@Override
@@ -113,53 +130,61 @@
mController.removeCallback(this /* StateListener */);
}
mController = null;
- mRenderer.finish();
- mRenderer = null;
- mEglHelper.finish();
- mEglHelper = null;
- getSurfaceHolder().getSurface().hwuiDestroy();
+
+ mWorker.getThreadHandler().post(() -> {
+ mRenderer.finish();
+ mRenderer = null;
+ mEglHelper.finish();
+ mEglHelper = null;
+ getSurfaceHolder().getSurface().hwuiDestroy();
+ });
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
- mEglHelper.init(holder);
- mRenderer.onSurfaceCreated();
+ mWorker.getThreadHandler().post(() -> {
+ mEglHelper.init(holder);
+ mRenderer.onSurfaceCreated();
+ });
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- mRenderer.onSurfaceChanged(width, height);
- mNeedRedraw = true;
+ mWorker.getThreadHandler().post(() -> {
+ mRenderer.onSurfaceChanged(width, height);
+ mNeedRedraw = true;
+ });
}
@Override
public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
- if (mNeedRedraw) {
- preRender();
- requestRender();
- postRender();
- mNeedRedraw = false;
- }
- }
-
- @Override
- public SurfaceHolder getHolder() {
- return getSurfaceHolder();
+ mWorker.getThreadHandler().post(() -> {
+ if (mNeedRedraw) {
+ preRender();
+ requestRender();
+ postRender();
+ mNeedRedraw = false;
+ }
+ });
}
@Override
public void onStatePostChange() {
// When back to home, we try to release EGL, which is preserved in lock screen or aod.
if (mController.getState() == StatusBarState.SHADE) {
- scheduleFinishRendering();
+ mWorker.getThreadHandler().post(this::scheduleFinishRendering);
}
}
@Override
public void preRender() {
+ mWorker.getThreadHandler().post(this::preRenderInternal);
+ }
+
+ private void preRenderInternal() {
boolean contextRecreated = false;
Rect frame = getSurfaceHolder().getSurfaceFrame();
- getMainThreadHandler().removeCallbacks(mFinishRenderingTask);
+ cancelFinishRenderingTask();
// Check if we need to recreate egl context.
if (!mEglHelper.hasEglContext()) {
@@ -187,6 +212,10 @@
@Override
public void requestRender() {
+ mWorker.getThreadHandler().post(this::requestRenderInternal);
+ }
+
+ private void requestRenderInternal() {
Rect frame = getSurfaceHolder().getSurfaceFrame();
boolean readyToRender = mEglHelper.hasEglContext() && mEglHelper.hasEglSurface()
&& frame.width() > 0 && frame.height() > 0;
@@ -205,12 +234,16 @@
@Override
public void postRender() {
- scheduleFinishRendering();
+ mWorker.getThreadHandler().post(this::scheduleFinishRendering);
+ }
+
+ private void cancelFinishRenderingTask() {
+ mWorker.getThreadHandler().removeCallbacks(mFinishRenderingTask);
}
private void scheduleFinishRendering() {
- getMainThreadHandler().removeCallbacks(mFinishRenderingTask);
- getMainThreadHandler().postDelayed(mFinishRenderingTask, DELAY_FINISH_RENDERING);
+ cancelFinishRenderingTask();
+ mWorker.getThreadHandler().postDelayed(mFinishRenderingTask, DELAY_FINISH_RENDERING);
}
private void finishRendering() {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index cdcf660..66b4ef4 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -127,15 +127,15 @@
true /* touchscreen */),
new PluginSensor(
new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY),
- Settings.Secure.DOZE_WAKE_SCREEN_GESTURE,
+ Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE,
mConfig.wakeScreenGestureAvailable() && alwaysOn,
DozeLog.REASON_SENSOR_WAKE_UP,
false /* reports touch coordinates */,
false /* touchscreen */),
new PluginSensor(
new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN),
- Settings.Secure.DOZE_WAKE_SCREEN_GESTURE,
- mConfig.wakeScreenGestureAvailable() && alwaysOn,
+ Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE,
+ mConfig.wakeScreenGestureAvailable(),
DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN,
false /* reports touch coordinates */,
false /* touchscreen */, mConfig.getWakeLockScreenDebounce()),
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java
index 1744c4e..d7411260 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/EglHelper.java
@@ -60,6 +60,9 @@
*/
public class EglHelper {
private static final String TAG = EglHelper.class.getSimpleName();
+ // Below two constants make drawing at low priority, so other things can preempt our drawing.
+ private static final int EGL_CONTEXT_PRIORITY_LEVEL_IMG = 0x3100;
+ private static final int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103;
private EGLDisplay mEglDisplay;
private EGLConfig mEglConfig;
@@ -181,7 +184,8 @@
* @return true if EglContext is ready.
*/
public boolean createEglContext() {
- int[] attrib_list = new int[] {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
+ int[] attrib_list = new int[] {EGL_CONTEXT_CLIENT_VERSION, 2,
+ EGL_CONTEXT_PRIORITY_LEVEL_IMG, EGL_CONTEXT_PRIORITY_LOW_IMG, EGL_NONE};
mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT, attrib_list, 0);
if (mEglContext == EGL_NO_CONTEXT) {
Log.w(TAG, "eglCreateContext failed: " + GLUtils.getEGLErrorString(eglGetError()));
diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java
index b615a5f..60ea1cd 100644
--- a/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java
+++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/GLWallpaperRenderer.java
@@ -17,7 +17,6 @@
package com.android.systemui.glwallpaper;
import android.util.Size;
-import android.view.SurfaceHolder;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -83,12 +82,6 @@
interface SurfaceProxy {
/**
- * Get surface holder.
- * @return surface holder.
- */
- SurfaceHolder getHolder();
-
- /**
* Ask proxy to start rendering frame to surface.
*/
void requestRender();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 99f9e99..ed6f599 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -119,7 +119,7 @@
private boolean mIsEnabled;
private int mCurrentBoundedUserId = -1;
private float mNavBarButtonAlpha;
- private MotionEvent mStatusBarGestureDownEvent;
+ private boolean mInputFocusTransferStarted;
private float mWindowCornerRadius;
private boolean mSupportsRoundedCornersOnWindows;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
@@ -164,6 +164,7 @@
}
}
+ // TODO: change the method signature to use (boolean inputFocusTransferStarted)
@Override
public void onStatusBarMotionEvent(MotionEvent event) {
if (!verifyCaller("onStatusBarMotionEvent")) {
@@ -175,16 +176,16 @@
mHandler.post(()->{
StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
if (bar != null) {
- bar.dispatchNotificationsPanelTouchEvent(event);
int action = event.getActionMasked();
if (action == ACTION_DOWN) {
- mStatusBarGestureDownEvent = MotionEvent.obtain(event);
+ mInputFocusTransferStarted = true;
+
}
if (action == ACTION_UP || action == ACTION_CANCEL) {
- mStatusBarGestureDownEvent.recycle();
- mStatusBarGestureDownEvent = null;
+ mInputFocusTransferStarted = false;
}
+ bar.onInputFocusTransfer(mInputFocusTransferStarted);
event.recycle();
}
});
@@ -590,14 +591,12 @@
}
public void cleanupAfterDeath() {
- if (mStatusBarGestureDownEvent != null) {
+ if (mInputFocusTransferStarted) {
mHandler.post(()-> {
StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
if (bar != null) {
- mStatusBarGestureDownEvent.setAction(MotionEvent.ACTION_CANCEL);
- bar.dispatchNotificationsPanelTouchEvent(mStatusBarGestureDownEvent);
- mStatusBarGestureDownEvent.recycle();
- mStatusBarGestureDownEvent = null;
+ mInputFocusTransferStarted = false;
+ bar.onInputFocusTransfer(false);
}
});
}
@@ -782,6 +781,7 @@
pw.println(QuickStepContract.isBackGestureDisabled(mSysUiStateFlags));
pw.print(" assistantGestureDisabled=");
pw.println(QuickStepContract.isAssistantGestureDisabled(mSysUiStateFlags));
+ pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted);
}
public interface OverviewProxyListener {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index ca001c6..1e7c44c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
import android.annotation.IntDef;
@@ -29,12 +28,12 @@
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricSourceType;
-import android.os.Handler;
import android.os.Trace;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityNodeInfo;
import androidx.annotation.Nullable;
@@ -43,6 +42,7 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -67,7 +67,7 @@
public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener,
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
UnlockMethodCache.OnUnlockMethodChangedListener,
- NotificationWakeUpCoordinator.WakeUpListener {
+ NotificationWakeUpCoordinator.WakeUpListener, ViewTreeObserver.OnPreDrawListener {
private static final int STATE_LOCKED = 0;
private static final int STATE_LOCK_OPEN = 1;
@@ -79,12 +79,12 @@
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final AccessibilityController mAccessibilityController;
private final DockManager mDockManager;
- private final Handler mMainHandler;
private final KeyguardMonitor mKeyguardMonitor;
private final KeyguardBypassController mBypassController;
private final NotificationWakeUpCoordinator mWakeUpCoordinator;
private int mLastState = 0;
+ private boolean mForceUpdate;
private boolean mTransientBiometricsError;
private boolean mIsFaceUnlockState;
private boolean mSimLocked;
@@ -92,23 +92,20 @@
private boolean mPulsing;
private boolean mDozing;
private boolean mDocked;
- private boolean mLastDozing;
- private boolean mLastPulsing;
private int mIconColor;
private float mDozeAmount;
- private int mIconRes;
private boolean mBouncerShowing;
- private boolean mWasPulsingOnThisFrame;
private boolean mWakeAndUnlockRunning;
private boolean mKeyguardShowing;
private boolean mShowingLaunchAffordance;
+ private boolean mUpdatePending;
private final KeyguardMonitor.Callback mKeyguardMonitorCallback =
new KeyguardMonitor.Callback() {
@Override
public void onKeyguardShowingChanged() {
mKeyguardShowing = mKeyguardMonitor.isShowing();
- update(false /* force */);
+ update();
}
};
private final DockManager.DockEventListener mDockEventListener =
@@ -119,7 +116,7 @@
|| event == DockManager.STATE_DOCKED_HIDE;
if (docked != mDocked) {
mDocked = docked;
- update(true /* force */);
+ update();
}
}
};
@@ -129,9 +126,8 @@
@Override
public void onSimStateChanged(int subId, int slotId,
IccCardConstants.State simState) {
- boolean oldSimLocked = mSimLocked;
mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure();
- update(oldSimLocked != mSimLocked);
+ update();
}
@Override
@@ -149,11 +145,6 @@
public void onStrongAuthStateChanged(int userId) {
update();
}
-
- @Override
- public void onBiometricsCleared() {
- update();
- }
};
@Inject
@@ -164,8 +155,7 @@
KeyguardBypassController bypassController,
NotificationWakeUpCoordinator wakeUpCoordinator,
KeyguardMonitor keyguardMonitor,
- @Nullable DockManager dockManager,
- @Named(MAIN_HANDLER_NAME) Handler mainHandler) {
+ @Nullable DockManager dockManager) {
super(context, attrs);
mContext = context;
mUnlockMethodCache = UnlockMethodCache.getInstance(context);
@@ -177,7 +167,6 @@
mWakeUpCoordinator = wakeUpCoordinator;
mKeyguardMonitor = keyguardMonitor;
mDockManager = dockManager;
- mMainHandler = mainHandler;
}
@Override
@@ -194,6 +183,7 @@
mDockManager.addListener(mDockEventListener);
}
onThemeChanged();
+ update();
}
@Override
@@ -247,51 +237,61 @@
}
public void update(boolean force) {
- int state = getState();
- mIsFaceUnlockState = state == STATE_SCANNING_FACE;
- if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing || force) {
- @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(mLastState,
- state, mLastPulsing, mPulsing, mLastDozing, mDozing);
- boolean isAnim = lockAnimIndex != -1;
-
- int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state);
- if (iconRes != mIconRes) {
- mIconRes = iconRes;
-
- Drawable icon = mContext.getDrawable(iconRes);
- final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
- ? (AnimatedVectorDrawable) icon
- : null;
- setImageDrawable(icon, false);
- if (mIsFaceUnlockState) {
- announceForAccessibility(getContext().getString(
- R.string.accessibility_scanning_face));
- }
-
- if (animation != null && isAnim) {
- animation.forceAnimationOnUI();
- animation.clearAnimationCallbacks();
- animation.registerAnimationCallback(new Animatable2.AnimationCallback() {
- @Override
- public void onAnimationEnd(Drawable drawable) {
- if (getDrawable() == animation && state == getState()
- && doesAnimationLoop(lockAnimIndex)) {
- animation.start();
- } else {
- Trace.endAsyncSection("LockIcon#Animation", state);
- }
- }
- });
- Trace.beginAsyncSection("LockIcon#Animation", state);
- animation.start();
- }
- }
- updateDarkTint();
-
- mLastState = state;
- mLastDozing = mDozing;
- mLastPulsing = mPulsing;
+ if (force) {
+ mForceUpdate = true;
}
+ if (!mUpdatePending) {
+ mUpdatePending = true;
+ getViewTreeObserver().addOnPreDrawListener(this);
+ }
+ }
+
+ @Override
+ public boolean onPreDraw() {
+ mUpdatePending = false;
+ getViewTreeObserver().removeOnPreDrawListener(this);
+
+ int state = getState();
+ int lastState = mLastState;
+ mIsFaceUnlockState = state == STATE_SCANNING_FACE;
+ mLastState = state;
+
+ if (lastState != state || mForceUpdate) {
+ mForceUpdate = false;
+ @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(lastState,
+ state, mPulsing, mDozing);
+ boolean isAnim = lockAnimIndex != -1;
+ int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state);
+
+ Drawable icon = mContext.getDrawable(iconRes);
+ final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
+ ? (AnimatedVectorDrawable) icon
+ : null;
+ setImageDrawable(icon, false);
+ if (mIsFaceUnlockState) {
+ announceForAccessibility(getContext().getString(
+ R.string.accessibility_scanning_face));
+ }
+
+ if (animation != null && isAnim) {
+ animation.forceAnimationOnUI();
+ animation.clearAnimationCallbacks();
+ animation.registerAnimationCallback(new Animatable2.AnimationCallback() {
+ @Override
+ public void onAnimationEnd(Drawable drawable) {
+ if (getDrawable() == animation && state == getState()
+ && doesAnimationLoop(lockAnimIndex)) {
+ animation.start();
+ } else {
+ Trace.endAsyncSection("LockIcon#Animation", state);
+ }
+ }
+ });
+ Trace.beginAsyncSection("LockIcon#Animation", state);
+ animation.start();
+ }
+ }
+ updateDarkTint();
boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked);
boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning
@@ -302,8 +302,25 @@
&& !mBouncerShowing) {
invisible = true;
}
- setVisibility(invisible ? INVISIBLE : VISIBLE);
+ boolean wasInvisible = getVisibility() == INVISIBLE;
+ if (invisible != wasInvisible) {
+ setVisibility(invisible ? INVISIBLE : VISIBLE);
+ animate().cancel();
+ if (!invisible) {
+ setScaleX(0);
+ setScaleY(0);
+ animate()
+ .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN)
+ .scaleX(1)
+ .scaleY(1)
+ .withLayer()
+ .setDuration(233)
+ .start();
+ }
+ }
updateClickability();
+
+ return true;
}
private void updateClickability() {
@@ -364,30 +381,22 @@
return lockAnimIndex == SCANNING;
}
- private int getAnimationIndexForTransition(int oldState, int newState,
- boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing) {
+ private static int getAnimationIndexForTransition(int oldState, int newState, boolean pulsing,
+ boolean dozing) {
// Never animate when screen is off
- if (dozing && !pulsing && !mWasPulsingOnThisFrame) {
+ if (dozing && !pulsing) {
return -1;
}
- boolean isError = oldState != STATE_BIOMETRICS_ERROR && newState == STATE_BIOMETRICS_ERROR;
- boolean justUnlocked = oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN;
- boolean justLocked = oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED;
- boolean nowPulsing = !wasPulsing && pulsing;
- boolean turningOn = wasDozing && !dozing && !mWasPulsingOnThisFrame;
-
- if (isError) {
+ if (newState == STATE_BIOMETRICS_ERROR) {
return ERROR;
- } else if (justUnlocked) {
+ } else if (oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN) {
return UNLOCK;
- } else if (justLocked) {
+ } else if (oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED) {
return LOCK;
} else if (newState == STATE_SCANNING_FACE) {
return SCANNING;
- } else if ((nowPulsing || turningOn) && newState != STATE_LOCK_OPEN) {
- return LOCK_IN;
}
return -1;
}
@@ -407,37 +416,33 @@
}
@Retention(RetentionPolicy.SOURCE)
- @IntDef({ERROR, UNLOCK, LOCK, SCANNING, LOCK_IN})
+ @IntDef({ERROR, UNLOCK, LOCK, SCANNING})
@interface LockAnimIndex {}
- private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3, LOCK_IN = 4;
+ private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3;
private static final int[][] LOCK_ANIM_RES_IDS = new int[][] {
{
R.anim.lock_to_error,
R.anim.lock_unlock,
R.anim.lock_lock,
- R.anim.lock_scanning,
- R.anim.lock_in,
+ R.anim.lock_scanning
},
{
R.anim.lock_to_error_circular,
R.anim.lock_unlock_circular,
R.anim.lock_lock_circular,
- R.anim.lock_scanning_circular,
- R.anim.lock_in_circular,
+ R.anim.lock_scanning_circular
},
{
R.anim.lock_to_error_filled,
R.anim.lock_unlock_filled,
R.anim.lock_lock_filled,
- R.anim.lock_scanning_filled,
- R.anim.lock_in_filled,
+ R.anim.lock_scanning_filled
},
{
R.anim.lock_to_error_rounded,
R.anim.lock_unlock_rounded,
R.anim.lock_lock_rounded,
- R.anim.lock_scanning_rounded,
- R.anim.lock_in_rounded,
+ R.anim.lock_scanning_rounded
},
};
@@ -462,7 +467,7 @@
return STATE_LOCK_OPEN;
} else if (mTransientBiometricsError) {
return STATE_BIOMETRICS_ERROR;
- } else if (updateMonitor.isFaceDetectionRunning()) {
+ } else if (updateMonitor.isFaceDetectionRunning() && !mPulsing) {
return STATE_SCANNING_FACE;
} else {
return STATE_LOCKED;
@@ -481,12 +486,6 @@
*/
public void setPulsing(boolean pulsing) {
mPulsing = pulsing;
- if (!mPulsing) {
- mWasPulsingOnThisFrame = true;
- mMainHandler.post(() -> {
- mWasPulsingOnThisFrame = false;
- });
- }
update();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 32dc96d..53ce167 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -290,6 +290,8 @@
private boolean mIsFullWidth;
private boolean mBlockingExpansionForCurrentTouch;
+ private boolean mExpectingOpenPanelGesture;
+
/**
* Current dark amount that follows regular interpolation curve of animation.
*/
@@ -1246,6 +1248,28 @@
}
}
+ /**
+ * Input focus transfer is about to happen.
+ */
+ public void startWaitingForOpenPanelGesture() {
+ if (!isFullyCollapsed()) {
+ return;
+ }
+ mExpectingOpenPanelGesture = true;
+ onTrackingStarted();
+ }
+
+ /**
+ * Input focus transfer has already happened as this view decided to intercept
+ * very first down event.
+ */
+ public void stopWaitingForOpenPanelGesture() {
+ if (mExpectingOpenPanelGesture) {
+ mExpectingOpenPanelGesture = false;
+ onTrackingStopped(false);
+ }
+ }
+
@Override
protected boolean flingExpands(float vel, float vectorVel, float x, float y) {
boolean expands = super.flingExpands(vel, vectorVel, x, y);
@@ -1258,8 +1282,12 @@
}
@Override
- protected boolean hasConflictingGestures() {
- return mBarState != StatusBarState.SHADE;
+ protected boolean shouldGestureWaitForTouchSlop() {
+ if (mExpectingOpenPanelGesture) {
+ mExpectingOpenPanelGesture = false;
+ return false;
+ }
+ return isFullyCollapsed() || mBarState != StatusBarState.SHADE;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index a9a3b2d..a5b221b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -301,7 +301,7 @@
final float y = event.getY(pointerIndex);
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
- mGestureWaitForTouchSlop = isFullyCollapsed() || hasConflictingGestures();
+ mGestureWaitForTouchSlop = shouldGestureWaitForTouchSlop();
mIgnoreXTouchSlop = isFullyCollapsed() || shouldGestureIgnoreXTouchSlop(x, y);
}
@@ -519,7 +519,7 @@
return (int) (mUnlockFalsingThreshold * factor);
}
- protected abstract boolean hasConflictingGestures();
+ protected abstract boolean shouldGestureWaitForTouchSlop();
protected abstract boolean shouldGestureIgnoreXTouchSlop(float x, float y);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 7db4afc..9188968 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1918,19 +1918,18 @@
mStatusBarKeyguardViewManager.readyForKeyguardDone();
}
- public void dispatchNotificationsPanelTouchEvent(MotionEvent ev) {
+ /**
+ * Called when another window is about to transfer it's input focus.
+ */
+ public void onInputFocusTransfer(boolean start) {
if (!mCommandQueue.panelsEnabled()) {
return;
}
- mNotificationPanel.dispatchTouchEvent(ev);
- int action = ev.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- // Start ignoring all touch events coming to status bar window.
- // TODO: handle case where ACTION_UP is not sent over the binder
- mStatusBarWindowController.setNotTouchable(true);
- } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- mStatusBarWindowController.setNotTouchable(false);
+ if (start) {
+ mNotificationPanel.startWaitingForOpenPanelGesture();
+ } else {
+ mNotificationPanel.stopWaitingForOpenPanelGesture();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index 78eb394..f36c56f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -190,6 +190,11 @@
public void onKeyguardVisibilityChanged(boolean showing) {
update(false /* updateAlways */);
}
+
+ @Override
+ public void onBiometricsCleared() {
+ update(false /* alwaysUpdate */);
+ }
};
public boolean isTrustManaged() {
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
index bebc20b..775a3ab 100644
--- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java
@@ -31,6 +31,11 @@
static final String REASON_WRAP = "wrap";
/**
+ * Default wake-lock timeout, to avoid battery regressions.
+ */
+ long DEFAULT_MAX_TIMEOUT = 20000;
+
+ /**
* @param why A tag that will be saved for sysui dumps.
* @see android.os.PowerManager.WakeLock#acquire()
**/
@@ -46,7 +51,14 @@
Runnable wrap(Runnable r);
static WakeLock createPartial(Context context, String tag) {
- return wrap(createPartialInner(context, tag));
+ return createPartial(context, tag, DEFAULT_MAX_TIMEOUT);
+ }
+
+ /**
+ * Creates a {@link WakeLock} that has a default release timeout.
+ * @see android.os.PowerManager.WakeLock#acquire(long) */
+ static WakeLock createPartial(Context context, String tag, long maxTimeout) {
+ return wrap(createPartialInner(context, tag), maxTimeout);
}
@VisibleForTesting
@@ -66,7 +78,14 @@
};
}
- static WakeLock wrap(final PowerManager.WakeLock inner) {
+ /**
+ * Create a {@link WakeLock} containing a {@link PowerManager.WakeLock}.
+ * @param inner To be wrapped.
+ * @param maxTimeout When to expire.
+ * @return The new wake lock.
+ */
+ @VisibleForTesting
+ static WakeLock wrap(final PowerManager.WakeLock inner, long maxTimeout) {
return new WakeLock() {
private final HashMap<String, Integer> mActiveClients = new HashMap<>();
@@ -74,7 +93,7 @@
public void acquire(String why) {
mActiveClients.putIfAbsent(why, 0);
mActiveClients.put(why, mActiveClients.get(why) + 1);
- inner.acquire();
+ inner.acquire(maxTimeout);
}
/** @see PowerManager.WakeLock#release() */
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
index 66eb299..3357be8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
@@ -42,7 +42,7 @@
@Before
public void setUp() {
mInner = WakeLock.createPartialInner(mContext, WakeLockTest.class.getName());
- mWakeLock = WakeLock.wrap(mInner);
+ mWakeLock = WakeLock.wrap(mInner, 20000);
}
@After
@@ -70,14 +70,6 @@
}
@Test
- public void wakeLock_refCounted() {
- mWakeLock.acquire(WHY);
- mWakeLock.acquire(WHY);
- mWakeLock.release(WHY);
- assertTrue(mInner.isHeld());
- }
-
- @Test
public void wakeLock_wrap() {
boolean[] ran = new boolean[1];
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index b90d602..6fd802d 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -279,7 +279,8 @@
mService.mDisplayManagerInternal.screenshot(displayId);
if (gb != null) {
try {
- surface.attachAndQueueBuffer(gb.getGraphicBuffer());
+ surface.attachAndQueueBufferWithColorSpace(gb.getGraphicBuffer(),
+ gb.getColorSpace());
} catch (RuntimeException e) {
Slog.w(TAG, "Failed to attach screenshot - " + e.getMessage());
}
diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
index ee4e462..bb1570e 100644
--- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
+++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java
@@ -69,7 +69,7 @@
if (buffer != null) {
final Surface surface = new Surface();
surface.copyFrom(mSurfaceControl);
- surface.attachAndQueueBuffer(buffer);
+ surface.attachAndQueueBufferWithColorSpace(buffer, screenshotBuffer.getColorSpace());
surface.release();
}
getPendingTransaction().show(mSurfaceControl);
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index c3762d6..1905476 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -284,7 +284,6 @@
}
private void drawSnapshot() {
- final GraphicBuffer buffer = mSnapshot.getSnapshot();
mSurface.copyFrom(mSurfaceControl);
if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Drawing snapshot surface sizeMismatch="
@@ -293,9 +292,9 @@
// The dimensions of the buffer and the window don't match, so attaching the buffer
// will fail. Better create a child window with the exact dimensions and fill the parent
// window with the background color!
- drawSizeMismatchSnapshot(buffer);
+ drawSizeMismatchSnapshot();
} else {
- drawSizeMatchSnapshot(buffer);
+ drawSizeMatchSnapshot();
}
synchronized (mService.mGlobalLock) {
mShownTime = SystemClock.uptimeMillis();
@@ -307,15 +306,17 @@
mSnapshot = null;
}
- private void drawSizeMatchSnapshot(GraphicBuffer buffer) {
- mSurface.attachAndQueueBuffer(buffer);
+ private void drawSizeMatchSnapshot() {
+ mSurface.attachAndQueueBufferWithColorSpace(mSnapshot.getSnapshot(),
+ mSnapshot.getColorSpace());
mSurface.release();
}
- private void drawSizeMismatchSnapshot(GraphicBuffer buffer) {
+ private void drawSizeMismatchSnapshot() {
if (!mSurface.isValid()) {
throw new IllegalStateException("mSurface does not hold a valid surface.");
}
+ final GraphicBuffer buffer = mSnapshot.getSnapshot();
final SurfaceSession session = new SurfaceSession();
// We consider nearly matched dimensions as there can be rounding errors and the user won't
// notice very minute differences from scaling one dimension more than the other
@@ -355,7 +356,7 @@
} finally {
SurfaceControl.closeTransaction();
}
- surface.attachAndQueueBuffer(buffer);
+ surface.attachAndQueueBufferWithColorSpace(buffer, mSnapshot.getColorSpace());
surface.release();
if (aspectRatioMismatch) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 3cccd26..c75e0da 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -7693,7 +7693,7 @@
private void onPointerDownOutsideFocusLocked(IBinder touchedToken) {
final WindowState touchedWindow = windowForClientLocked(null, touchedToken, false);
- if (touchedWindow == null) {
+ if (touchedWindow == null || !touchedWindow.canReceiveKeys()) {
return;
}