Revert "Refactor WirelessChargingAnimation."

Revert submission 19754180-wirelessripplerefactor-master

Reason for revert: Build breakage b/244142057
Reverted Changes:
I2fbb8f0c6:Refactor WirelessChargingAnimation.
I3f0db106c:Refactor WirelessRippleAnimation

Change-Id: I7f093be2f4c4fc8679ebf93bee12f2c9c37e4b39
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java
new file mode 100644
index 0000000..e82d0ea
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.charging;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+import android.util.Slog;
+import android.view.Gravity;
+import android.view.WindowManager;
+
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
+import com.android.systemui.ripple.RippleShader.RippleShape;
+
+/**
+ * A WirelessChargingAnimation is a view containing view + animation for wireless charging.
+ * @hide
+ */
+public class WirelessChargingAnimation {
+    public static final int UNKNOWN_BATTERY_LEVEL = -1;
+    public static final long DURATION = 1500;
+    private static final String TAG = "WirelessChargingView";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    private final WirelessChargingView mCurrentWirelessChargingView;
+    private static WirelessChargingView mPreviousWirelessChargingView;
+
+    public interface Callback {
+        void onAnimationStarting();
+        void onAnimationEnded();
+    }
+
+    /**
+     * Constructs an empty WirelessChargingAnimation object.  If looper is null,
+     * Looper.myLooper() is used.  Must set
+     * {@link WirelessChargingAnimation#mCurrentWirelessChargingView}
+     * before calling {@link #show} - can be done through {@link #makeWirelessChargingAnimation}.
+     * @hide
+     */
+    private WirelessChargingAnimation(@NonNull Context context, @Nullable Looper looper,
+            int transmittingBatteryLevel, int batteryLevel, Callback callback, boolean isDozing,
+            RippleShape rippleShape, UiEventLogger uiEventLogger) {
+        mCurrentWirelessChargingView = new WirelessChargingView(context, looper,
+                transmittingBatteryLevel, batteryLevel, callback, isDozing,
+                rippleShape, uiEventLogger);
+    }
+
+    /**
+     * Creates a wireless charging animation object populated with next view.
+     *
+     * @hide
+     */
+    public static WirelessChargingAnimation makeWirelessChargingAnimation(@NonNull Context context,
+            @Nullable Looper looper, int transmittingBatteryLevel, int batteryLevel,
+            Callback callback, boolean isDozing, RippleShape rippleShape,
+            UiEventLogger uiEventLogger) {
+        return new WirelessChargingAnimation(context, looper, transmittingBatteryLevel,
+                batteryLevel, callback, isDozing, rippleShape, uiEventLogger);
+    }
+
+    /**
+     * Creates a charging animation object using mostly default values for non-dozing and unknown
+     * battery level without charging number shown.
+     */
+    public static WirelessChargingAnimation makeChargingAnimationWithNoBatteryLevel(
+            @NonNull Context context, RippleShape rippleShape, UiEventLogger uiEventLogger) {
+        return makeWirelessChargingAnimation(context, null,
+                UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, null, false,
+                rippleShape, uiEventLogger);
+    }
+
+    /**
+     * Show the view for the specified duration.
+     */
+    public void show(long delay) {
+        if (mCurrentWirelessChargingView == null ||
+                mCurrentWirelessChargingView.mNextView == null) {
+            throw new RuntimeException("setView must have been called");
+        }
+
+        if (mPreviousWirelessChargingView != null) {
+            mPreviousWirelessChargingView.hide(0);
+        }
+
+        mPreviousWirelessChargingView = mCurrentWirelessChargingView;
+        mCurrentWirelessChargingView.show(delay);
+        mCurrentWirelessChargingView.hide(delay + DURATION);
+    }
+
+    private static class WirelessChargingView {
+        private static final int SHOW = 0;
+        private static final int HIDE = 1;
+
+        private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+        private final Handler mHandler;
+        private final UiEventLogger mUiEventLogger;
+
+        private int mGravity;
+        private WirelessChargingLayout mView;
+        private WirelessChargingLayout mNextView;
+        private WindowManager mWM;
+        private Callback mCallback;
+
+        public WirelessChargingView(Context context, @Nullable Looper looper,
+                int transmittingBatteryLevel, int batteryLevel, Callback callback,
+                boolean isDozing, RippleShape rippleShape, UiEventLogger uiEventLogger) {
+            mCallback = callback;
+            mNextView = new WirelessChargingLayout(context, transmittingBatteryLevel, batteryLevel,
+                    isDozing, rippleShape);
+            mGravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER;
+            mUiEventLogger = uiEventLogger;
+
+            final WindowManager.LayoutParams params = mParams;
+            params.height = WindowManager.LayoutParams.MATCH_PARENT;
+            params.width = WindowManager.LayoutParams.MATCH_PARENT;
+            params.format = PixelFormat.TRANSLUCENT;
+            params.type = WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
+            params.setTitle("Charging Animation");
+            params.layoutInDisplayCutoutMode =
+                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+            params.setFitInsetsTypes(0 /* ignore all system bar insets */);
+            params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+            params.setTrustedOverlay();
+
+            if (looper == null) {
+                // Use Looper.myLooper() if looper is not specified.
+                looper = Looper.myLooper();
+                if (looper == null) {
+                    throw new RuntimeException(
+                            "Can't display wireless animation on a thread that has not called "
+                                    + "Looper.prepare()");
+                }
+            }
+
+            mHandler = new Handler(looper, null) {
+                @Override
+                public void handleMessage(Message msg) {
+                    switch (msg.what) {
+                        case SHOW: {
+                            handleShow();
+                            break;
+                        }
+                        case HIDE: {
+                            handleHide();
+                            // Don't do this in handleHide() because it is also invoked by
+                            // handleShow()
+                            mNextView = null;
+                            break;
+                        }
+                    }
+                }
+            };
+        }
+
+        public void show(long delay) {
+            if (DEBUG) Slog.d(TAG, "SHOW: " + this);
+            mHandler.sendMessageDelayed(Message.obtain(mHandler, SHOW), delay);
+        }
+
+        public void hide(long duration) {
+            mHandler.removeMessages(HIDE);
+
+            if (DEBUG) Slog.d(TAG, "HIDE: " + this);
+            mHandler.sendMessageDelayed(Message.obtain(mHandler, HIDE), duration);
+        }
+
+        private void handleShow() {
+            if (DEBUG) {
+                Slog.d(TAG, "HANDLE SHOW: " + this + " mView=" + mView + " mNextView="
+                        + mNextView);
+            }
+
+            if (mView != mNextView) {
+                // remove the old view if necessary
+                handleHide();
+                mView = mNextView;
+                Context context = mView.getContext().getApplicationContext();
+                String packageName = mView.getContext().getOpPackageName();
+                if (context == null) {
+                    context = mView.getContext();
+                }
+                mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+                mParams.packageName = packageName;
+                mParams.hideTimeoutMilliseconds = DURATION;
+
+                if (mView.getParent() != null) {
+                    if (DEBUG) Slog.d(TAG, "REMOVE! " + mView + " in " + this);
+                    mWM.removeView(mView);
+                }
+                if (DEBUG) Slog.d(TAG, "ADD! " + mView + " in " + this);
+
+                try {
+                    if (mCallback != null) {
+                        mCallback.onAnimationStarting();
+                    }
+                    mWM.addView(mView, mParams);
+                    mUiEventLogger.log(WirelessChargingRippleEvent.WIRELESS_RIPPLE_PLAYED);
+                } catch (WindowManager.BadTokenException e) {
+                    Slog.d(TAG, "Unable to add wireless charging view. " + e);
+                }
+            }
+        }
+
+        private void handleHide() {
+            if (DEBUG) Slog.d(TAG, "HANDLE HIDE: " + this + " mView=" + mView);
+            if (mView != null) {
+                if (mView.getParent() != null) {
+                    if (DEBUG) Slog.d(TAG, "REMOVE! " + mView + " in " + this);
+                    if (mCallback != null) {
+                        mCallback.onAnimationEnded();
+                    }
+                    mWM.removeViewImmediate(mView);
+                }
+
+                mView = null;
+            }
+        }
+
+        enum WirelessChargingRippleEvent implements UiEventLogger.UiEventEnum {
+            @UiEvent(doc = "Wireless charging ripple effect played")
+            WIRELESS_RIPPLE_PLAYED(830);
+
+            private final int mInt;
+            WirelessChargingRippleEvent(int id) {
+                mInt = id;
+            }
+
+            @Override public int getId() {
+                return mInt;
+            }
+        }
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java
index 6da65d2..0839338 100644
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java
@@ -16,9 +16,6 @@
 
 package com.android.systemui.charging;
 
-import static com.android.systemui.charging.WirelessChargingRippleControllerKt.DEFAULT_DURATION;
-import static com.android.systemui.charging.WirelessChargingRippleControllerKt.UNKNOWN_BATTERY_LEVEL;
-
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
@@ -44,43 +41,39 @@
 import java.text.NumberFormat;
 
 /**
- * Layout that is used for wireless charging.
- *
- * <p>Wireless charging layout has {@link RippleView} and text view to show the battery level.
+ * @hide
  */
 final class WirelessChargingLayout extends FrameLayout {
+    private static final long CIRCLE_RIPPLE_ANIMATION_DURATION = 1500;
+    private static final long ROUNDED_BOX_RIPPLE_ANIMATION_DURATION = 1750;
     private static final int SCRIM_COLOR = 0x4C000000;
     private static final int SCRIM_FADE_DURATION = 300;
     private RippleView mRippleView;
 
     WirelessChargingLayout(Context context, int transmittingBatteryLevel, int batteryLevel,
-            boolean isDozing, RippleShape rippleShape, long duration) {
+            boolean isDozing, RippleShape rippleShape) {
         super(context);
-        init(context, null, transmittingBatteryLevel, batteryLevel, isDozing, rippleShape,
-                duration);
+        init(context, null, transmittingBatteryLevel, batteryLevel, isDozing, rippleShape);
     }
 
     private WirelessChargingLayout(Context context) {
         super(context);
-        init(context, null, /* isDozing= */ false, RippleShape.CIRCLE,
-                DEFAULT_DURATION);
+        init(context, null, /* isDozing= */ false, RippleShape.CIRCLE);
     }
 
     private WirelessChargingLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
-        init(context, attrs, /* isDozing= */false, RippleShape.CIRCLE,
-                DEFAULT_DURATION);
+        init(context, attrs, /* isDozing= */false, RippleShape.CIRCLE);
     }
 
-    private void init(Context c, AttributeSet attrs, boolean isDozing, RippleShape rippleShape,
-            long duration) {
-        init(c, attrs, -1, -1, isDozing, rippleShape, duration);
+    private void init(Context c, AttributeSet attrs, boolean isDozing, RippleShape rippleShape) {
+        init(c, attrs, -1, -1, isDozing, rippleShape);
     }
 
     private void init(Context context, AttributeSet attrs, int transmittingBatteryLevel,
-            int batteryLevel, boolean isDozing, RippleShape rippleShape, long duration) {
+            int batteryLevel, boolean isDozing, RippleShape rippleShape) {
         final boolean showTransmittingBatteryLevel =
-                (transmittingBatteryLevel != UNKNOWN_BATTERY_LEVEL);
+                (transmittingBatteryLevel != WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL);
 
         // set style based on background
         int style = R.style.ChargingAnim_WallpaperBackground;
@@ -93,7 +86,7 @@
         // amount of battery:
         final TextView percentage = findViewById(R.id.wireless_charging_percentage);
 
-        if (batteryLevel != UNKNOWN_BATTERY_LEVEL) {
+        if (batteryLevel != WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL) {
             percentage.setText(NumberFormat.getPercentInstance().format(batteryLevel / 100f));
             percentage.setAlpha(0);
         }
@@ -132,6 +125,7 @@
         // play all animations together
         AnimatorSet animatorSet = new AnimatorSet();
         animatorSet.playTogether(textSizeAnimator, textOpacityAnimator, textFadeAnimator);
+
         ValueAnimator scrimFadeInAnimator = ObjectAnimator.ofArgb(this,
                 "backgroundColor", Color.TRANSPARENT, SCRIM_COLOR);
         scrimFadeInAnimator.setDuration(SCRIM_FADE_DURATION);
@@ -140,21 +134,25 @@
                 "backgroundColor", SCRIM_COLOR, Color.TRANSPARENT);
         scrimFadeOutAnimator.setDuration(SCRIM_FADE_DURATION);
         scrimFadeOutAnimator.setInterpolator(Interpolators.LINEAR);
-        scrimFadeOutAnimator.setStartDelay(duration - SCRIM_FADE_DURATION);
+        scrimFadeOutAnimator.setStartDelay((rippleShape == RippleShape.CIRCLE
+                ? CIRCLE_RIPPLE_ANIMATION_DURATION : ROUNDED_BOX_RIPPLE_ANIMATION_DURATION)
+                - SCRIM_FADE_DURATION);
         AnimatorSet animatorSetScrim = new AnimatorSet();
         animatorSetScrim.playTogether(scrimFadeInAnimator, scrimFadeOutAnimator);
         animatorSetScrim.start();
 
         mRippleView = findViewById(R.id.wireless_charging_ripple);
         mRippleView.setupShader(rippleShape);
-        mRippleView.setDuration(duration);
-        int color = Utils.getColorAttr(mRippleView.getContext(),
-                android.R.attr.colorAccent).getDefaultColor();
         if (mRippleView.getRippleShape() == RippleShape.ROUNDED_BOX) {
+            mRippleView.setDuration(ROUNDED_BOX_RIPPLE_ANIMATION_DURATION);
             mRippleView.setSparkleStrength(0.22f);
+            int color = Utils.getColorAttr(mRippleView.getContext(),
+                    android.R.attr.colorAccent).getDefaultColor();
             mRippleView.setColor(ColorUtils.setAlphaComponent(color, 28));
         } else {
-            mRippleView.setColor(ColorUtils.setAlphaComponent(color, 45));
+            mRippleView.setDuration(CIRCLE_RIPPLE_ANIMATION_DURATION);
+            mRippleView.setColor(Utils.getColorAttr(mRippleView.getContext(),
+                    android.R.attr.colorAccent).getDefaultColor());
         }
 
         OnAttachStateChangeListener listener = new OnAttachStateChangeListener() {
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingRippleController.kt
deleted file mode 100644
index 8b5c7eb..0000000
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingRippleController.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.charging
-
-import android.content.Context
-import android.view.WindowManager
-import androidx.annotation.VisibleForTesting
-import com.android.internal.logging.UiEventLogger
-import com.android.systemui.charging.WirelessChargingView.WirelessChargingRippleEvent
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.log.LogBuffer
-import com.android.systemui.log.LogLevel
-import com.android.systemui.log.dagger.ChargingLog
-import com.android.systemui.util.concurrency.DelayableExecutor
-import javax.inject.Inject
-
-const val UNKNOWN_BATTERY_LEVEL = -1
-const val DEFAULT_DURATION: Long = 1500
-
-/**
- * Controls the wireless charging animation.
- */
-@SysUISingleton
-class WirelessChargingRippleController @Inject constructor(
-        context: Context,
-        private val uiEventLogger: UiEventLogger,
-        @Main private val delayableExecutor: DelayableExecutor,
-        @ChargingLog private val logBuffer: LogBuffer
-) {
-    private val windowManager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE)
-            as WindowManager
-
-    @VisibleForTesting
-    var wirelessChargingView: WirelessChargingView? = null
-    private var callback: Callback? = null
-
-    companion object {
-        private const val TAG = "WirelessChargingRippleController"
-    }
-
-    /**
-     * Shows the wireless charging view with the given delay.
-     *
-     * If there's already the animation is playing, the new request will be disregarded.
-     * @param wirelessChargingView WirelessChargingView to display.
-     * @param delay the start delay of the WirelessChargingView.
-     * @param callback optional callback that is triggered on animations start and end.
-     */
-    fun show(wirelessChargingView: WirelessChargingView, delay: Long, callback: Callback? = null) {
-        // Avoid multiple animation getting triggered.
-        if (this.wirelessChargingView != null) {
-            logBuffer.log(TAG, LogLevel.INFO, "Already playing animation, disregard " +
-                    "$wirelessChargingView")
-            return
-        }
-
-        this.wirelessChargingView = wirelessChargingView
-        this.callback = callback
-
-        logBuffer.log(TAG, LogLevel.DEBUG, "SHOW: $wirelessChargingView")
-        delayableExecutor.executeDelayed({ showInternal() }, delay)
-
-        logBuffer.log(TAG, LogLevel.DEBUG, "HIDE: $wirelessChargingView")
-        delayableExecutor.executeDelayed({ hideInternal() }, delay + wirelessChargingView.duration)
-    }
-
-    private fun showInternal() {
-        if (wirelessChargingView == null) {
-            return
-        }
-
-        val chargingLayout = wirelessChargingView!!.getWirelessChargingLayout()
-        try {
-            callback?.onAnimationStarting()
-            windowManager.addView(chargingLayout, wirelessChargingView!!.wmLayoutParams)
-            uiEventLogger.log(WirelessChargingRippleEvent.WIRELESS_RIPPLE_PLAYED)
-        } catch (e: WindowManager.BadTokenException) {
-            logBuffer.log(TAG, LogLevel.ERROR, "Unable to add wireless charging view. $e")
-        }
-    }
-
-    private fun hideInternal() {
-        wirelessChargingView?.getWirelessChargingLayout().let {
-            callback?.onAnimationEnded()
-            if (it?.parent != null) {
-                windowManager.removeViewImmediate(it)
-            }
-        }
-        wirelessChargingView = null
-        callback = null
-    }
-
-    /**
-     * Callbacks that are triggered on animation events.
-     */
-    interface Callback {
-        /** Triggered when the animation starts playing. */
-        fun onAnimationStarting()
-        /** Triggered when the animation ends playing. */
-        fun onAnimationEnded()
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.kt b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.kt
deleted file mode 100644
index d510cf6..0000000
--- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingView.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.charging
-
-import android.content.Context
-import android.graphics.PixelFormat
-import android.view.View
-import android.view.WindowManager
-import com.android.internal.logging.UiEvent
-import com.android.internal.logging.UiEventLogger.UiEventEnum
-import com.android.systemui.ripple.RippleShader.RippleShape
-
-/**
- * WirelessChargingView that encapsulates the current and next [WirelessChargingLayout]s.
- */
-class WirelessChargingView (
-        context: Context,
-        transmittingBatteryLevel: Int,
-        batteryLevel: Int,
-        isDozing: Boolean,
-        rippleShape: RippleShape,
-        val duration: Long,
-) {
-    companion object {
-        @JvmStatic
-        fun create(
-                context: Context,
-                transmittingBatteryLevel: Int,
-                batteryLevel: Int,
-                isDozing: Boolean,
-                rippleShape: RippleShape,
-                duration: Long = DEFAULT_DURATION
-        ): WirelessChargingView {
-            return WirelessChargingView(context, transmittingBatteryLevel, batteryLevel, isDozing,
-                    rippleShape, duration)
-        }
-
-        @JvmStatic
-        fun createWithNoBatteryLevel(
-                context: Context,
-                rippleShape: RippleShape,
-                duration: Long = DEFAULT_DURATION
-        ): WirelessChargingView {
-            return create(context,
-                    UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, false, rippleShape,
-                    duration)
-        }
-    }
-
-    val wmLayoutParams = WindowManager.LayoutParams().apply {
-        height = WindowManager.LayoutParams.MATCH_PARENT
-        width = WindowManager.LayoutParams.MATCH_PARENT
-        format = PixelFormat.TRANSLUCENT
-        type = WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG
-        title = "Charging Animation"
-        layoutInDisplayCutoutMode =
-                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
-        fitInsetsTypes = 0
-        flags = (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
-        packageName = context.applicationContext.opPackageName
-        setTrustedOverlay()
-    }
-
-    private val wirelessChargingLayout: WirelessChargingLayout =
-            WirelessChargingLayout(context, transmittingBatteryLevel, batteryLevel, isDozing,
-                    rippleShape, duration)
-    fun getWirelessChargingLayout(): View = wirelessChargingLayout
-
-    internal enum class WirelessChargingRippleEvent(private val mInt: Int) : UiEventEnum {
-        @UiEvent(doc = "Wireless charging ripple effect played")
-        WIRELESS_RIPPLE_PLAYED(830);
-
-        override fun getId(): Int {
-            return mInt
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/ChargingLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/ChargingLog.java
deleted file mode 100644
index 3cfc22c..0000000
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/ChargingLog.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.log.dagger;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.android.systemui.log.LogBuffer;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-
-import javax.inject.Qualifier;
-
-/**
- * A {@link LogBuffer} for {@link com.android.systemui.charging}
- */
-@Qualifier
-@Documented
-@Retention(RUNTIME)
-public @interface ChargingLog {
-}
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 1562720..9af42f8 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -316,14 +316,4 @@
     public static LogBuffer provideKeyguardViewMediatorLogBuffer(LogBufferFactory factory) {
         return factory.create("KeyguardViewMediatorLog", 100);
     }
-
-    /**
-     * Provides a {@link LogBuffer} for use by {@link com.android.systemui.charging}.
-     */
-    @Provides
-    @SysUISingleton
-    @ChargingLog
-    public static LogBuffer provideChargingLogBuffer(LogBufferFactory factory) {
-        return factory.create("ChargingLog", 20);
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/ripple/RippleShader.kt b/packages/SystemUI/src/com/android/systemui/ripple/RippleShader.kt
index d2f3a6a..db7c1fd 100644
--- a/packages/SystemUI/src/com/android/systemui/ripple/RippleShader.kt
+++ b/packages/SystemUI/src/com/android/systemui/ripple/RippleShader.kt
@@ -68,7 +68,7 @@
                 float rippleInsideAlpha = (1.-inside) * in_fadeFill;
                 float rippleRingAlpha = (1.-sparkleRing) * in_fadeRing;
                 float rippleAlpha = max(rippleInsideAlpha, rippleRingAlpha) * in_color.a;
-                vec4 ripple = vec4(in_color.rgb, 1.0) * rippleAlpha;
+                vec4 ripple = in_color * rippleAlpha;
                 return mix(ripple, vec4(sparkle), sparkle * in_sparkle_strength);
             }
         """
@@ -84,7 +84,7 @@
                 float rippleInsideAlpha = (1.-inside) * in_fadeFill;
                 float rippleRingAlpha = (1.-sparkleRing) * in_fadeRing;
                 float rippleAlpha = max(rippleInsideAlpha, rippleRingAlpha) * in_color.a;
-                vec4 ripple = vec4(in_color.rgb, 1.0) * rippleAlpha;
+                vec4 ripple = in_color * rippleAlpha;
                 return mix(ripple, vec4(sparkle), sparkle * in_sparkle_strength);
             }
         """
@@ -100,7 +100,7 @@
                 float rippleInsideAlpha = (1.-inside) * in_fadeFill;
                 float rippleRingAlpha = (1.-sparkleRing) * in_fadeRing;
                 float rippleAlpha = max(rippleInsideAlpha, rippleRingAlpha) * in_color.a;
-                vec4 ripple = vec4(in_color.rgb, 1.0) * rippleAlpha;
+                vec4 ripple = in_color * rippleAlpha;
                 return mix(ripple, vec4(sparkle), sparkle * in_sparkle_strength);
             }
         """
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index cb2ca51..a190485 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -31,8 +31,7 @@
 import static androidx.lifecycle.Lifecycle.State.RESUMED;
 
 import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
-import static com.android.systemui.charging.WirelessChargingRippleControllerKt.DEFAULT_DURATION;
-import static com.android.systemui.charging.WirelessChargingRippleControllerKt.UNKNOWN_BATTERY_LEVEL;
+import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL;
 import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP;
 import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
@@ -139,8 +138,7 @@
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.camera.CameraIntents;
 import com.android.systemui.charging.WiredChargingRippleController;
-import com.android.systemui.charging.WirelessChargingRippleController;
-import com.android.systemui.charging.WirelessChargingView;
+import com.android.systemui.charging.WirelessChargingAnimation;
 import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
 import com.android.systemui.dagger.SysUISingleton;
@@ -509,7 +507,6 @@
     private final WallpaperManager mWallpaperManager;
 
     private CentralSurfacesComponent mCentralSurfacesComponent;
-    private WirelessChargingRippleController mWirelessChargingRippleController;
 
     // Flags for disabling the status bar
     // Two variables becaseu the first one evidently ran out of room for new flags.
@@ -735,7 +732,6 @@
             InteractionJankMonitor jankMonitor,
             DeviceStateManager deviceStateManager,
             WiredChargingRippleController wiredChargingRippleController,
-            WirelessChargingRippleController wirelessChargingRippleController,
             IDreamManager dreamManager) {
         super(context);
         mNotificationsController = notificationsController;
@@ -853,7 +849,6 @@
         deviceStateManager.registerCallback(mMainExecutor,
                 new FoldStateListener(mContext, this::onFoldedStateChanged));
         wiredChargingRippleController.registerCallbacks();
-        mWirelessChargingRippleController = wirelessChargingRippleController;
     }
 
     @Override
@@ -2167,11 +2162,9 @@
 
     protected void showChargingAnimation(int batteryLevel, int transmittingBatteryLevel,
             long animationDelay) {
-        WirelessChargingView wirelessChargingView = WirelessChargingView.create(mContext,
-                transmittingBatteryLevel, batteryLevel, /* isDozing= */ false,
-                RippleShape.CIRCLE, DEFAULT_DURATION);
-        mWirelessChargingRippleController.show(wirelessChargingView, animationDelay,
-                new WirelessChargingRippleController.Callback() {
+        WirelessChargingAnimation.makeWirelessChargingAnimation(mContext, null,
+                transmittingBatteryLevel, batteryLevel,
+                new WirelessChargingAnimation.Callback() {
                     @Override
                     public void onAnimationStarting() {
                         mNotificationShadeWindowController.setRequestTopUi(true, TAG);
@@ -2181,7 +2174,8 @@
                     public void onAnimationEnded() {
                         mNotificationShadeWindowController.setRequestTopUi(false, TAG);
                     }
-                });
+                }, /* isDozing= */ false, RippleShape.CIRCLE,
+                sUiEventLogger).show(animationDelay);
     }
 
     @Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/charging/WirelessChargingRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/charging/WirelessChargingRippleControllerTest.kt
deleted file mode 100644
index d967b59..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/charging/WirelessChargingRippleControllerTest.kt
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.charging
-
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper.RunWithLooper
-import androidx.test.filters.SmallTest
-import com.android.internal.logging.testing.UiEventLoggerFake
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.dump.logcatLogBuffer
-import com.android.systemui.ripple.RippleShader.RippleShape
-import com.android.systemui.util.concurrency.FakeExecutor
-import com.android.systemui.util.time.FakeSystemClock
-import com.google.common.truth.Truth.assertThat
-import junit.framework.Assert.assertEquals
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-@RunWithLooper
-class WirelessChargingRippleControllerTest : SysuiTestCase() {
-
-    private val duration: Long = 1000L
-    private val fakeSystemClock: FakeSystemClock = FakeSystemClock()
-    private lateinit var wirelessChargingRippleController: WirelessChargingRippleController
-    private val fakeExecutor = FakeExecutor(fakeSystemClock)
-
-    @Before
-    fun setUp() {
-        wirelessChargingRippleController = WirelessChargingRippleController(
-                context, UiEventLoggerFake(), fakeExecutor, logcatLogBuffer())
-        fakeSystemClock.setElapsedRealtime(0L)
-    }
-
-    @Test
-    fun showWirelessChargingView_hasCorrectDuration() {
-        val wirelessChargingView = WirelessChargingView.create(
-                context, UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, false,
-                RippleShape.ROUNDED_BOX, duration
-        )
-
-        wirelessChargingRippleController.show(wirelessChargingView, 0)
-        fakeExecutor.runAllReady()
-
-        assertEquals(duration, wirelessChargingView.duration)
-    }
-
-    @Test
-    fun showWirelessChargingView_triggerWhilePlayingAnim_doesNotShowRipple() {
-        val wirelessChargingViewFirst = WirelessChargingView.create(
-                context, UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, false,
-                RippleShape.ROUNDED_BOX, duration
-        )
-        wirelessChargingRippleController.show(wirelessChargingViewFirst, 0)
-        assertThat(fakeExecutor.numPending()).isEqualTo(2)
-        fakeExecutor.runNextReady() // run showInternal
-
-        // ensure we haven't run hideInternal, to simulate the first one is still playing.
-        assertThat(fakeExecutor.numPending()).isEqualTo(1)
-
-        val wirelessChargingViewSecond = WirelessChargingView.create(
-                context, UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, false,
-                RippleShape.ROUNDED_BOX, duration
-        )
-        wirelessChargingRippleController.show(wirelessChargingViewSecond, 0)
-
-        assertEquals(wirelessChargingViewFirst,
-                wirelessChargingRippleController.wirelessChargingView)
-    }
-
-    @Test
-    fun hideWirelessChargingView_afterDuration() {
-        fakeSystemClock.setElapsedRealtime(0L)
-        val wirelessChargingView = WirelessChargingView.create(
-                context, UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, false,
-                RippleShape.ROUNDED_BOX, duration
-        )
-        wirelessChargingRippleController.show(wirelessChargingView, 0)
-
-        assertThat(fakeExecutor.numPending()).isEqualTo(2)
-        with(fakeExecutor) {
-            runNextReady() // run showInternal
-            advanceClockToNext()
-            runNextReady() // run hideInternal
-        }
-
-        assertEquals(null, wirelessChargingRippleController.wirelessChargingView)
-    }
-
-    @Test
-    fun showWirelessChargingView_withCallback_triggersCallback() {
-        val callback = object : WirelessChargingRippleController.Callback {
-            var onAnimationStartingCalled = false
-            var onAnimationEndedCalled = false
-
-            override fun onAnimationStarting() {
-                onAnimationStartingCalled = true
-            }
-
-            override fun onAnimationEnded() {
-                onAnimationEndedCalled = true
-            }
-        }
-        val wirelessChargingView = WirelessChargingView.create(
-                context, UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, false,
-                RippleShape.CIRCLE, duration
-        )
-        wirelessChargingRippleController.show(wirelessChargingView, 0, callback)
-        assertThat(fakeExecutor.numPending()).isEqualTo(2)
-
-        fakeExecutor.runNextReady() // run showInternal
-        assertEquals(true, callback.onAnimationStartingCalled)
-
-        fakeExecutor.advanceClockToNext()
-
-        fakeExecutor.runNextReady() // run hideInternal
-        assertEquals(true, callback.onAnimationEndedCalled)
-    }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
index 3443ae6..a0f7087 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java
@@ -88,7 +88,6 @@
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.charging.WiredChargingRippleController;
-import com.android.systemui.charging.WirelessChargingRippleController;
 import com.android.systemui.classifier.FalsingCollectorFake;
 import com.android.systemui.classifier.FalsingManagerFake;
 import com.android.systemui.colorextraction.SysuiColorExtractor;
@@ -284,7 +283,6 @@
     @Mock private InteractionJankMonitor mJankMonitor;
     @Mock private DeviceStateManager mDeviceStateManager;
     @Mock private WiredChargingRippleController mWiredChargingRippleController;
-    @Mock private WirelessChargingRippleController mWirelessChargingRippleController;
     private ShadeController mShadeController;
     private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
     private FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock);
@@ -467,9 +465,7 @@
                 mActivityLaunchAnimator,
                 mJankMonitor,
                 mDeviceStateManager,
-                mWiredChargingRippleController,
-                mWirelessChargingRippleController,
-                mDreamManager);
+                mWiredChargingRippleController, mDreamManager);
         when(mKeyguardViewMediator.registerCentralSurfaces(
                 any(CentralSurfacesImpl.class),
                 any(NotificationPanelViewController.class),