diff options
Diffstat (limited to 'libs')
20 files changed, 170 insertions, 81 deletions
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index f3baad7a02e4..602cd5d6daee 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -43,10 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Superior 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla inferior completa"</string> - <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utilizar el modo una mano"</string> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Usar Modo una mano"</string> <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para salir, desliza el dedo hacia arriba desde la parte inferior de la pantalla o toca cualquier zona que haya encima de la aplicación"</string> - <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar modo una mano"</string> - <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Salir del modo una mano"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar Modo una mano"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Salir del Modo una mano"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Ajustes de las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menú adicional"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Volver a añadir a la pila"</string> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index fed3ea9b53f9..a17f543278f7 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -62,10 +62,10 @@ <string name="bubbles_user_education_title" msgid="2112319053732691899">"گپ بااستفاده از حبابکها"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"مکالمههای جدید بهصورت نمادهای شناور یا حبابکها نشان داده میشوند. برای باز کردن حبابکها ضربه بزنید. برای جابهجایی، آن را بکشید."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"کنترل حبابکها در هرزمانی"</string> - <string name="bubbles_user_education_manage" msgid="3460756219946517198">"برای خاموش کردن «حبابکها» از این برنامه، روی «مدیریت» ضربه بزنید"</string> + <string name="bubbles_user_education_manage" msgid="3460756219946517198">"برای خاموش کردن حبابکها از این برنامه، روی «مدیریت» ضربه بزنید"</string> <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"متوجهام"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"هیچ حبابک جدیدی وجود ندارد"</string> - <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"حبابکها اخیر و حبابکها ردشده اینجا ظاهر خواهند شد"</string> + <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"حبابکهای اخیر و حبابکهای ردشده اینجا ظاهر خواهند شد"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"حباب"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"مدیریت"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"حبابک رد شد."</string> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index a9693865e2c4..b2c005544c32 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -67,7 +67,7 @@ <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"हाल ही के बबल्स मौजूद नहीं हैं"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string> - <string name="manage_bubbles_text" msgid="7730624269650594419">"प्रबंधित करें"</string> + <string name="manage_bubbles_text" msgid="7730624269650594419">"मैनेज करें"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल खारिज किया गया."</string> <string name="restart_button_description" msgid="5887656107651190519">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन पर देखने के लिए टैप करें."</string> <string name="got_it" msgid="4428750913636945527">"ठीक है"</string> diff --git a/libs/WindowManager/Shell/res/values-iw/strings_tv.xml b/libs/WindowManager/Shell/res/values-iw/strings_tv.xml index 8ca54e0a5473..ef98a9c41cf2 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings_tv.xml @@ -19,6 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"תמונה בתוך תמונה"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(תוכנית ללא כותרת)"</string> - <string name="pip_close" msgid="9135220303720555525">"סגור PIP"</string> + <string name="pip_close" msgid="9135220303720555525">"סגירת PIP"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"מסך מלא"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index 530d40a79ca3..0c64c7639327 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -62,7 +62,7 @@ <string name="bubbles_user_education_title" msgid="2112319053732691899">"Калкып чыкма билдирмелер аркылуу маектешүү"</string> <string name="bubbles_user_education_description" msgid="4215862563054175407">"Жаңы жазышуулар калкыма сүрөтчөлөр же калкып чыкма билдирмелер түрүндө көрүнөт. Калкып чыкма билдирмелерди ачуу үчүн таптап коюңуз. Жылдыруу үчүн сүйрөңүз."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Калкып чыкма билдирмелерди каалаган убакта көзөмөлдөңүз"</string> - <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Бул колдонмодогу калкып чыкма билдирмелерди өчүрүү үчүн, \"Башкарууну\" басыңыз"</string> + <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Бул колдонмодогу калкып чыкма билдирмелерди өчүрүү үчүн \"Башкарууну\" басыңыз"</string> <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Түшүндүм"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Азырынча эч нерсе жок"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Акыркы жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт"</string> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 882ac374fde9..dfa364a763a8 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -30,7 +30,7 @@ <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदल्नुहोस्"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"एप विभाजित स्क्रिनमा काम नगर्न सक्छ।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।"</string> - <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"यो अनुप्रयोगले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string> + <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"यो एपले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"अनुप्रयोगले सहायक प्रदर्शनहरूमा लञ्च सुविधालाई समर्थन गर्दैन।"</string> <string name="accessibility_divider" msgid="703810061635792791">"विभाजित-स्क्रिन छुट्याउने"</string> <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"बायाँ भाग फुल स्क्रिन"</string> diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml index 6698a01dc159..a138fee32550 100644 --- a/libs/WindowManager/Shell/res/values/config.xml +++ b/libs/WindowManager/Shell/res/values/config.xml @@ -40,7 +40,7 @@ <integer name="long_press_dock_anim_duration">250</integer> <!-- Animation duration for translating of one handed when trigger / dismiss. --> - <integer name="config_one_handed_translate_animation_duration">300</integer> + <integer name="config_one_handed_translate_animation_duration">800</integer> <!-- One handed mode default offset % of display size --> <fraction name="config_one_handed_offset">40%</fraction> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java index 125e322974bf..25dd3ca57b92 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java @@ -22,8 +22,7 @@ import android.annotation.IntDef; import android.content.Context; import android.graphics.Rect; import android.view.SurfaceControl; -import android.view.animation.Interpolator; -import android.view.animation.OvershootInterpolator; +import android.view.animation.BaseInterpolator; import android.window.WindowContainerToken; import androidx.annotation.VisibleForTesting; @@ -54,7 +53,7 @@ public class OneHandedAnimationController { public @interface TransitionDirection { } - private final Interpolator mOvershootInterpolator; + private final OneHandedInterpolator mInterpolator; private final OneHandedSurfaceTransactionHelper mSurfaceTransactionHelper; private final HashMap<WindowContainerToken, OneHandedTransitionAnimator> mAnimatorMap = new HashMap<>(); @@ -64,7 +63,7 @@ public class OneHandedAnimationController { */ public OneHandedAnimationController(Context context) { mSurfaceTransactionHelper = new OneHandedSurfaceTransactionHelper(context); - mOvershootInterpolator = new OvershootInterpolator(); + mInterpolator = new OneHandedInterpolator(); } @SuppressWarnings("unchecked") @@ -102,7 +101,7 @@ public class OneHandedAnimationController { OneHandedTransitionAnimator setupOneHandedTransitionAnimator( OneHandedTransitionAnimator animator) { animator.setSurfaceTransactionHelper(mSurfaceTransactionHelper); - animator.setInterpolator(mOvershootInterpolator); + animator.setInterpolator(mInterpolator); animator.setFloatValues(FRACTION_START, FRACTION_END); return animator; } @@ -112,6 +111,8 @@ public class OneHandedAnimationController { * * @param <T> Type of property to animate, either offset (float) */ + // TODO: Refactoring to use SpringAnimation and DynamicAnimation instead of using ValueAnimator + // to implement One-Handed transition animation. (b/185129031) public abstract static class OneHandedTransitionAnimator<T> extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener, ValueAnimator.AnimatorListener { @@ -297,4 +298,15 @@ public class OneHandedAnimationController { }; } } + + /** + * An Interpolator for One-Handed transition animation. + */ + public class OneHandedInterpolator extends BaseInterpolator { + @Override + public float getInterpolation(float input) { + return (float) (Math.pow(2, -10 * input) * Math.sin(((input - 4.0f) / 4.0f) + * (2.0f * Math.PI) / 4.0f) + 1); + } + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 19098fdd5220..0a86ad835d14 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -343,7 +343,6 @@ public class OneHandedController implements RemoteCallable<OneHandedController> mOneHandedAccessibilityUtil.getOneHandedStartDescription()); mDisplayAreaOrganizer.scheduleOffset(0, yOffSet); mTimeoutHandler.resetTimer(); - mOneHandedUiEventLogger.writeEvent( OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_GESTURE_IN); } @@ -351,12 +350,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController> @VisibleForTesting void stopOneHanded() { - if (mDisplayAreaOrganizer.isInOneHanded()) { - mOneHandedAccessibilityUtil.announcementForScreenReader( - mOneHandedAccessibilityUtil.getOneHandedStopDescription()); - mDisplayAreaOrganizer.scheduleOffset(0, 0); - mTimeoutHandler.removeTimer(); - } + stopOneHanded(OneHandedUiEventLogger.EVENT_ONE_HANDED_TRIGGER_GESTURE_OUT); } private void stopOneHanded(int uiEvent) { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt index e50bde2eaeaa..6494f89997e5 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenDockActivity.kt @@ -23,7 +23,7 @@ import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory -import com.android.server.wm.flicker.LAUNCHER_TITLE +import com.android.server.wm.flicker.HOME_WINDOW_TITLE import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.helpers.launchSplitScreen import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible @@ -62,7 +62,7 @@ class EnterSplitScreenDockActivity( override val ignoredWindows: List<String> get() = listOf(LAUNCHER_PACKAGE_NAME, LIVE_WALLPAPER_PACKAGE_NAME, splitScreenApp.defaultWindowName, WindowManagerStateHelper.SPLASH_SCREEN_NAME, - WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME, *LAUNCHER_TITLE) + WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME, *HOME_WINDOW_TITLE) @FlakyTest(bugId = 169271943) @Test diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 4c4a15295690..3056e977f841 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -820,10 +820,11 @@ void SkiaCanvas::drawRipple(uirenderer::CanvasPropertyPrimitive* x, uirenderer::CanvasPropertyPrimitive* radius, uirenderer::CanvasPropertyPaint* paint, uirenderer::CanvasPropertyPrimitive* progress, + uirenderer::CanvasPropertyPrimitive* turbulencePhase, const SkRuntimeShaderBuilder& effectBuilder) { sk_sp<uirenderer::skiapipeline::AnimatedRipple> drawable( new uirenderer::skiapipeline::AnimatedRipple(x, y, radius, paint, progress, - effectBuilder)); + turbulencePhase, effectBuilder)); mCanvas->drawDrawable(drawable.get()); } diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h index e0a0be54fb39..995f00c6aa8d 100644 --- a/libs/hwui/SkiaCanvas.h +++ b/libs/hwui/SkiaCanvas.h @@ -153,6 +153,7 @@ public: uirenderer::CanvasPropertyPrimitive* radius, uirenderer::CanvasPropertyPaint* paint, uirenderer::CanvasPropertyPrimitive* progress, + uirenderer::CanvasPropertyPrimitive* turbulencePhase, const SkRuntimeShaderBuilder& effectBuilder) override; virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override; diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h index 855cd0d6436b..173f3948dd0e 100644 --- a/libs/hwui/canvas/CanvasOps.h +++ b/libs/hwui/canvas/CanvasOps.h @@ -152,32 +152,66 @@ struct CanvasOp<CanvasOpType::DrawRippleProperty> { sp<uirenderer::CanvasPropertyPrimitive> radius; sp<uirenderer::CanvasPropertyPaint> paint; sp<uirenderer::CanvasPropertyPrimitive> progress; + sp<uirenderer::CanvasPropertyPrimitive> turbulencePhase; sk_sp<SkRuntimeEffect> effect; + const float PI = 3.1415926535897932384626; + const float PI_ROTATE_RIGHT = PI * 0.0078125; + const float PI_ROTATE_LEFT = PI * -0.0078125; + const float SCALE = 1.5; + const float CIRCLE_X_1 = 0.01 * cos(SCALE * 0.55); + const float CIRCLE_Y_1 = 0.01 * sin(SCALE * 0.55); + const float CIRCLE_X_2 = -0.0066 * cos(SCALE * 0.45); + const float CIRCLE_Y_2 = -0.0066 * sin(SCALE * 0.45); + const float CIRCLE_X_3 = -0.0066 * cos(SCALE * 0.35); + const float CIRCLE_Y_3 = -0.0066 * sin(SCALE * 0.35); + void draw(SkCanvas* canvas) const { SkRuntimeShaderBuilder runtimeEffectBuilder(effect); - SkRuntimeShaderBuilder::BuilderUniform center = runtimeEffectBuilder.uniform("in_origin"); - if (center.fVar != nullptr) { - center = SkV2{x->value, y->value}; - } - - SkRuntimeShaderBuilder::BuilderUniform radiusU = - runtimeEffectBuilder.uniform("in_radius"); - if (radiusU.fVar != nullptr) { - radiusU = radius->value; - } - - SkRuntimeShaderBuilder::BuilderUniform progressU = - runtimeEffectBuilder.uniform("in_progress"); - if (progressU.fVar != nullptr) { - progressU = progress->value; - } + setUniform2f(runtimeEffectBuilder, "in_origin", x->value, y->value); + setUniform(runtimeEffectBuilder, "in_radius", radius); + setUniform(runtimeEffectBuilder, "in_progress", progress); + setUniform(runtimeEffectBuilder, "in_turbulencePhase", turbulencePhase); + + // + // Keep in sync with: + // frameworks/base/graphics/java/android/graphics/drawable/RippleShader.java + // + const float turbulence = turbulencePhase->value; + setUniform2f(runtimeEffectBuilder, "in_tCircle1", SCALE * 0.5 + (turbulence * CIRCLE_X_1), + SCALE * 0.5 + (turbulence * CIRCLE_Y_1)); + setUniform2f(runtimeEffectBuilder, "in_tCircle2", SCALE * 0.2 + (turbulence * CIRCLE_X_2), + SCALE * 0.2 + (turbulence * CIRCLE_Y_2)); + setUniform2f(runtimeEffectBuilder, "in_tCircle3", SCALE + (turbulence * CIRCLE_X_3), + SCALE + (turbulence * CIRCLE_Y_3)); + const float rotation1 = turbulence * PI_ROTATE_RIGHT + 1.7 * PI; + setUniform2f(runtimeEffectBuilder, "in_tRotation1", cos(rotation1), sin(rotation1)); + const float rotation2 = turbulence * PI_ROTATE_LEFT + 2 * PI; + setUniform2f(runtimeEffectBuilder, "in_tRotation2", cos(rotation2), sin(rotation2)); + const float rotation3 = turbulence * PI_ROTATE_RIGHT + 2.75 * PI; + setUniform2f(runtimeEffectBuilder, "in_tRotation3", cos(rotation3), sin(rotation3)); SkPaint paintMod = paint->value; paintMod.setShader(runtimeEffectBuilder.makeShader(nullptr, false)); canvas->drawCircle(x->value, y->value, radius->value, paintMod); } + + void setUniform(SkRuntimeShaderBuilder& effect, std::string name, + sp<uirenderer::CanvasPropertyPrimitive> property) const { + SkRuntimeShaderBuilder::BuilderUniform uniform = effect.uniform(name.c_str()); + if (uniform.fVar != nullptr) { + uniform = property->value; + } + } + + void setUniform2f(SkRuntimeShaderBuilder effect, std::string name, float a, float b) const { + SkRuntimeShaderBuilder::BuilderUniform uniform = effect.uniform(name.c_str()); + if (uniform.fVar != nullptr) { + uniform = SkV2{a, b}; + } + } + ASSERT_DRAWABLE() }; diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index c1feb767b459..837b055a8f42 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -146,6 +146,7 @@ public: uirenderer::CanvasPropertyPrimitive* radius, uirenderer::CanvasPropertyPaint* paint, uirenderer::CanvasPropertyPrimitive* progress, + uirenderer::CanvasPropertyPrimitive* turbulencePhase, const SkRuntimeShaderBuilder& effectBuilder) = 0; virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) = 0; diff --git a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp index 855d56ee2e55..eb5a88ad7ae8 100644 --- a/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp +++ b/libs/hwui/jni/android_graphics_DisplayListCanvas.cpp @@ -141,20 +141,22 @@ static void android_view_DisplayListCanvas_drawCircleProps(CRITICAL_JNI_PARAMS_C canvas->drawCircle(xProp, yProp, radiusProp, paintProp); } -static void android_view_DisplayListCanvas_drawRippleProps(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, - jlong xPropPtr, jlong yPropPtr, - jlong radiusPropPtr, jlong paintPropPtr, - jlong progressPropPtr, - jlong builderPtr) { +static void android_view_DisplayListCanvas_drawRippleProps( + CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong xPropPtr, jlong yPropPtr, + jlong radiusPropPtr, jlong paintPropPtr, jlong progressPropPtr, jlong turbulencePhasePtr, + jlong builderPtr) { Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr); CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr); CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr); CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr); + CanvasPropertyPrimitive* turbulencePhaseProp = + reinterpret_cast<CanvasPropertyPrimitive*>(turbulencePhasePtr); CanvasPropertyPaint* paintProp = reinterpret_cast<CanvasPropertyPaint*>(paintPropPtr); CanvasPropertyPrimitive* progressProp = reinterpret_cast<CanvasPropertyPrimitive*>(progressPropPtr); SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(builderPtr); - canvas->drawRipple(xProp, yProp, radiusProp, paintProp, progressProp, *builder); + canvas->drawRipple(xProp, yProp, radiusProp, paintProp, progressProp, turbulencePhaseProp, + *builder); } static void android_view_DisplayListCanvas_drawWebViewFunctor(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jint functor) { @@ -169,19 +171,22 @@ static void android_view_DisplayListCanvas_drawWebViewFunctor(CRITICAL_JNI_PARAM const char* const kClassPathName = "android/graphics/RecordingCanvas"; static JNINativeMethod gMethods[] = { - // ------------ @CriticalNative -------------- - { "nCreateDisplayListCanvas", "(JII)J", (void*) android_view_DisplayListCanvas_createDisplayListCanvas }, - { "nResetDisplayListCanvas", "(JJII)V", (void*) android_view_DisplayListCanvas_resetDisplayListCanvas }, - { "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize }, - { "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize }, - { "nEnableZ", "(JZ)V", (void*) android_view_DisplayListCanvas_enableZ }, - { "nFinishRecording", "(JJ)V", (void*) android_view_DisplayListCanvas_finishRecording }, - { "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode }, - { "nDrawTextureLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawTextureLayer }, - { "nDrawCircle", "(JJJJJ)V", (void*) android_view_DisplayListCanvas_drawCircleProps }, - { "nDrawRoundRect", "(JJJJJJJJ)V",(void*) android_view_DisplayListCanvas_drawRoundRectProps }, - { "nDrawWebViewFunctor", "(JI)V", (void*) android_view_DisplayListCanvas_drawWebViewFunctor }, - { "nDrawRipple", "(JJJJJJJ)V", (void*) android_view_DisplayListCanvas_drawRippleProps }, + // ------------ @CriticalNative -------------- + {"nCreateDisplayListCanvas", "(JII)J", + (void*)android_view_DisplayListCanvas_createDisplayListCanvas}, + {"nResetDisplayListCanvas", "(JJII)V", + (void*)android_view_DisplayListCanvas_resetDisplayListCanvas}, + {"nGetMaximumTextureWidth", "()I", (void*)android_view_DisplayListCanvas_getMaxTextureSize}, + {"nGetMaximumTextureHeight", "()I", + (void*)android_view_DisplayListCanvas_getMaxTextureSize}, + {"nEnableZ", "(JZ)V", (void*)android_view_DisplayListCanvas_enableZ}, + {"nFinishRecording", "(JJ)V", (void*)android_view_DisplayListCanvas_finishRecording}, + {"nDrawRenderNode", "(JJ)V", (void*)android_view_DisplayListCanvas_drawRenderNode}, + {"nDrawTextureLayer", "(JJ)V", (void*)android_view_DisplayListCanvas_drawTextureLayer}, + {"nDrawCircle", "(JJJJJ)V", (void*)android_view_DisplayListCanvas_drawCircleProps}, + {"nDrawRoundRect", "(JJJJJJJJ)V", (void*)android_view_DisplayListCanvas_drawRoundRectProps}, + {"nDrawWebViewFunctor", "(JI)V", (void*)android_view_DisplayListCanvas_drawWebViewFunctor}, + {"nDrawRipple", "(JJJJJJJJ)V", (void*)android_view_DisplayListCanvas_drawRippleProps}, }; int register_android_view_DisplayListCanvas(JNIEnv* env) { diff --git a/libs/hwui/pipeline/skia/AnimatedDrawables.h b/libs/hwui/pipeline/skia/AnimatedDrawables.h index 78591450f10a..7d65be1a76e6 100644 --- a/libs/hwui/pipeline/skia/AnimatedDrawables.h +++ b/libs/hwui/pipeline/skia/AnimatedDrawables.h @@ -19,6 +19,7 @@ #include <SkCanvas.h> #include <SkDrawable.h> #include <SkRuntimeEffect.h> +#include <math.h> #include <utils/RefBase.h> #include "CanvasProperty.h" @@ -61,12 +62,14 @@ public: uirenderer::CanvasPropertyPrimitive* radius, uirenderer::CanvasPropertyPaint* paint, uirenderer::CanvasPropertyPrimitive* progress, + uirenderer::CanvasPropertyPrimitive* turbulencePhase, const SkRuntimeShaderBuilder& effectBuilder) : mX(x) , mY(y) , mRadius(radius) , mPaint(paint) , mProgress(progress) + , mTurbulencePhase(turbulencePhase) , mRuntimeEffectBuilder(effectBuilder) {} protected: @@ -77,22 +80,28 @@ protected: return SkRect::MakeLTRB(x - radius, y - radius, x + radius, y + radius); } virtual void onDraw(SkCanvas* canvas) override { - SkRuntimeShaderBuilder::BuilderUniform center = mRuntimeEffectBuilder.uniform("in_origin"); - if (center.fVar != nullptr) { - center = SkV2{mX->value, mY->value}; - } - - SkRuntimeShaderBuilder::BuilderUniform radiusU = - mRuntimeEffectBuilder.uniform("in_radius"); - if (radiusU.fVar != nullptr) { - radiusU = mRadius->value; - } - - SkRuntimeShaderBuilder::BuilderUniform progressU = - mRuntimeEffectBuilder.uniform("in_progress"); - if (progressU.fVar != nullptr) { - progressU = mProgress->value; - } + setUniform2f("in_origin", mX->value, mY->value); + setUniform("in_radius", mRadius); + setUniform("in_progress", mProgress); + setUniform("in_turbulencePhase", mTurbulencePhase); + + // + // Keep in sync with: + // frameworks/base/graphics/java/android/graphics/drawable/RippleShader.java + // + const float turbulencePhase = mTurbulencePhase->value; + setUniform2f("in_tCircle1", SCALE * 0.5 + (turbulencePhase * CIRCLE_X_1), + SCALE * 0.5 + (turbulencePhase * CIRCLE_Y_1)); + setUniform2f("in_tCircle2", SCALE * 0.2 + (turbulencePhase * CIRCLE_X_2), + SCALE * 0.2 + (turbulencePhase * CIRCLE_Y_2)); + setUniform2f("in_tCircle3", SCALE + (turbulencePhase * CIRCLE_X_3), + SCALE + (turbulencePhase * CIRCLE_Y_3)); + const float rotation1 = turbulencePhase * PI_ROTATE_RIGHT + 1.7 * PI; + setUniform2f("in_tRotation1", cos(rotation1), sin(rotation1)); + const float rotation2 = turbulencePhase * PI_ROTATE_LEFT + 2 * PI; + setUniform2f("in_tRotation2", cos(rotation2), sin(rotation2)); + const float rotation3 = turbulencePhase * PI_ROTATE_RIGHT + 2.75 * PI; + setUniform2f("in_tRotation3", cos(rotation3), sin(rotation3)); SkPaint paint = mPaint->value; paint.setShader(mRuntimeEffectBuilder.makeShader(nullptr, false)); @@ -105,7 +114,35 @@ private: sp<uirenderer::CanvasPropertyPrimitive> mRadius; sp<uirenderer::CanvasPropertyPaint> mPaint; sp<uirenderer::CanvasPropertyPrimitive> mProgress; + sp<uirenderer::CanvasPropertyPrimitive> mTurbulencePhase; SkRuntimeShaderBuilder mRuntimeEffectBuilder; + + const float PI = 3.1415926535897932384626; + const float PI_ROTATE_RIGHT = PI * 0.0078125; + const float PI_ROTATE_LEFT = PI * -0.0078125; + const float SCALE = 1.5; + const float CIRCLE_X_1 = 0.01 * cos(SCALE * 0.55); + const float CIRCLE_Y_1 = 0.01 * sin(SCALE * 0.55); + const float CIRCLE_X_2 = -0.0066 * cos(SCALE * 0.45); + const float CIRCLE_Y_2 = -0.0066 * sin(SCALE * 0.45); + const float CIRCLE_X_3 = -0.0066 * cos(SCALE * 0.35); + const float CIRCLE_Y_3 = -0.0066 * sin(SCALE * 0.35); + + virtual void setUniform(std::string name, sp<uirenderer::CanvasPropertyPrimitive> property) { + SkRuntimeShaderBuilder::BuilderUniform uniform = + mRuntimeEffectBuilder.uniform(name.c_str()); + if (uniform.fVar != nullptr) { + uniform = property->value; + } + } + + virtual void setUniform2f(std::string name, float a, float b) { + SkRuntimeShaderBuilder::BuilderUniform uniform = + mRuntimeEffectBuilder.uniform(name.c_str()); + if (uniform.fVar != nullptr) { + uniform = SkV2{a, b}; + } + } }; class AnimatedCircle : public SkDrawable { diff --git a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp index 71f533c3fc4f..ab00dd5a487c 100644 --- a/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp +++ b/libs/hwui/pipeline/skia/GLFunctorDrawable.cpp @@ -24,6 +24,7 @@ #include "SkClipStack.h" #include "SkRect.h" #include "SkM44.h" +#include "utils/GLUtils.h" namespace android { namespace uirenderer { @@ -170,6 +171,8 @@ void GLFunctorDrawable::onDraw(SkCanvas* canvas) { setScissor(info.height, clipRegion.getBounds()); } + // WebView may swallow GL errors, so catch them here + GL_CHECKPOINT(LOW); mWebViewHandle->drawGl(info); if (clearStencilAfterFunctor) { diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp index 82814def6962..9e73f04c32ab 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp @@ -60,12 +60,11 @@ void SkiaRecordingCanvas::punchHole(const SkRRect& rect) { // Add the marker annotation to allow HWUI to determine where the current // clip/transformation should be applied SkVector vector = rect.getSimpleRadii(); - const int dataSize = 2; - float data[dataSize]; + float data[2]; data[0] = vector.x(); data[1] = vector.y(); mRecorder.drawAnnotation(rect.rect(), HOLE_PUNCH_ANNOTATION.c_str(), - SkData::MakeWithCopy(data, dataSize)); + SkData::MakeWithCopy(data, 2 * sizeof(float))); // Clear the current rect within the layer itself SkPaint paint = SkPaint(); @@ -115,9 +114,10 @@ void SkiaRecordingCanvas::drawRipple(uirenderer::CanvasPropertyPrimitive* x, uirenderer::CanvasPropertyPrimitive* radius, uirenderer::CanvasPropertyPaint* paint, uirenderer::CanvasPropertyPrimitive* progress, + uirenderer::CanvasPropertyPrimitive* turbulencePhase, const SkRuntimeShaderBuilder& effectBuilder) { drawDrawable(mDisplayList->allocateDrawable<AnimatedRipple>(x, y, radius, paint, progress, - effectBuilder)); + turbulencePhase, effectBuilder)); } void SkiaRecordingCanvas::enableZ(bool enableZ) { diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h index 06f2a27d22a5..4deb3b9c47c8 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.h @@ -75,6 +75,7 @@ public: uirenderer::CanvasPropertyPrimitive* radius, uirenderer::CanvasPropertyPaint* paint, uirenderer::CanvasPropertyPrimitive* progress, + uirenderer::CanvasPropertyPrimitive* turbulencePhase, const SkRuntimeShaderBuilder& effectBuilder) override; virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override; diff --git a/libs/hwui/pipeline/skia/TransformCanvas.cpp b/libs/hwui/pipeline/skia/TransformCanvas.cpp index 6bfbb0d270b7..a6e4c4cf9ca7 100644 --- a/libs/hwui/pipeline/skia/TransformCanvas.cpp +++ b/libs/hwui/pipeline/skia/TransformCanvas.cpp @@ -22,7 +22,7 @@ using namespace android::uirenderer::skiapipeline; void TransformCanvas::onDrawAnnotation(const SkRect& rect, const char* key, SkData* value) { if (HOLE_PUNCH_ANNOTATION == key) { - auto* rectParams = static_cast<const float*>(value->data()); + auto* rectParams = reinterpret_cast<const float*>(value->data()); float radiusX = rectParams[0]; float radiusY = rectParams[1]; SkRRect roundRect = SkRRect::MakeRectXY(rect, radiusX, radiusY); |