Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 381aacdf authored by haiyangl's avatar haiyangl Committed by Gerrit - the friendly Code Review server
Browse files

SystemUI: Add support for charging animation

As original design, when charged by USB or AC Cable, battery icon in
status bar and quick setting can not increase dynamically.

Support charging animation by updating battery icon while charging.
Add config to control whether show battery charging animation.

CRs-Fixed: 561586
Change-Id: I8092091a3406cf5499768ef46856ed4be4173d2b
parent 4ac8d879
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -167,6 +167,7 @@
        <item>0</item>
    </integer-array>
    <bool name="config_showRsrpSignalLevelforLTE">false</bool>
    <bool name="config_show_battery_charging_anim">false</bool>

    <!-- The duration in seconds to wait before the dismiss buttons are shown. -->
    <integer name="recents_task_bar_dismiss_delay_seconds">1</integer>
+43 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.graphics.RectF;
import android.graphics.Typeface;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.View;
@@ -45,7 +46,8 @@ public class BatteryMeterView extends View implements DemoMode,
    private static final boolean SHOW_100_PERCENT = false;

    private static final int FULL = 96;

    private static final int ADD_LEVEL = 10;
    private static final int ANIM_DURATION = 500;
    private static final float BOLT_LEVEL_THRESHOLD = 0.3f;  // opaque bolt below this fraction

    private final int[] mColors;
@@ -56,6 +58,8 @@ public class BatteryMeterView extends View implements DemoMode,
    private float mSubpixelSmoothingRight;
    private final Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint;
    private float mTextHeight, mWarningTextHeight;
    private int mAnimOffset;
    private boolean mIsCharging;

    private int mHeight;
    private int mWidth;
@@ -75,6 +79,7 @@ public class BatteryMeterView extends View implements DemoMode,

    private BatteryController mBatteryController;
    private boolean mPowerSaveEnabled;
    private final Handler mHandler;

    private class BatteryTracker extends BroadcastReceiver {
        public static final int UNKNOWN_LEVEL = -1;
@@ -150,6 +155,12 @@ public class BatteryMeterView extends View implements DemoMode,
    }

    BatteryTracker mTracker = new BatteryTracker();
    private final Runnable mInvalidate = new Runnable() {
        @Override
        public void run() {
            postInvalidate();
        }
    };

    @Override
    public void onAttachedToWindow() {
@@ -185,6 +196,7 @@ public class BatteryMeterView extends View implements DemoMode,
    public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        mHandler = new Handler();
        final Resources res = context.getResources();
        TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,
                defStyle, 0);
@@ -297,10 +309,39 @@ public class BatteryMeterView extends View implements DemoMode,
        return color;
    }

    private int updateChargingAnimLevel(BatteryTracker tracker) {
        int curLevel = tracker.level;

        if (tracker.status != BatteryManager.BATTERY_STATUS_CHARGING) {
            if (mIsCharging) {
                mIsCharging = false;
                mAnimOffset = 0;
                mHandler.removeCallbacks(mInvalidate);
            }
        } else {
            mIsCharging = true;

            curLevel += mAnimOffset;
            if (curLevel >= FULL) {
                curLevel = 100;
                mAnimOffset = 0;
            } else {
                mAnimOffset += ADD_LEVEL;
            }

            mHandler.removeCallbacks(mInvalidate);
            mHandler.postDelayed(mInvalidate, ANIM_DURATION);
        }
        return curLevel;
    }

    @Override
    public void draw(Canvas c) {
        BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker;
        final int level = tracker.level;
        final int level =
                mContext.getResources().getBoolean(R.bool.config_show_battery_charging_anim)
                ? updateChargingAnimLevel(tracker)
                : tracker.level;

        if (level == BatteryTracker.UNKNOWN_LEVEL) return;