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

Commit 6b8daefd authored by mxyyiyi's avatar mxyyiyi Committed by Automerger Merge Worker
Browse files

Impl highlight effect on BatteryChartView slots. am: 67506342 am: 9e4fed1b

parents 7f028b68 9e4fed1b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginVertical="16dp"
        android:textAlignment="viewStart"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="?android:attr/textColorSecondary"
        android:text="@string/battery_usage_chart_graph_hint_last_full_charge" />
@@ -40,7 +41,7 @@
        <com.android.settings.fuelgauge.batteryusage.BatteryChartView
            android:id="@+id/daily_battery_chart"
            android:layout_width="match_parent"
            android:layout_height="170dp"
            android:layout_height="@dimen/chartview_layout_height"
            android:layout_marginBottom="16dp"
            android:visibility="gone"
            android:contentDescription="@string/daily_battery_usage_chart"
@@ -50,7 +51,7 @@
        <com.android.settings.fuelgauge.batteryusage.BatteryChartView
            android:id="@+id/hourly_battery_chart"
            android:layout_width="match_parent"
            android:layout_height="170dp"
            android:layout_height="@dimen/chartview_layout_height"
            android:layout_marginBottom="16dp"
            android:visibility="visible"
            android:contentDescription="@string/hourly_battery_usage_chart"
+6 −0
Original line number Diff line number Diff line
@@ -390,6 +390,12 @@
    <dimen name="chartview_text_padding">6dp</dimen>
    <dimen name="chartview_divider_width">1dp</dimen>
    <dimen name="chartview_divider_height">4dp</dimen>
    <dimen name="chartview_transom_width">4dp</dimen>
    <dimen name="chartview_transom_radius">4dp</dimen>
    <dimen name="chartview_transom_icon_size">12dp</dimen>
    <dimen name="chartview_transom_padding_top">2dp</dimen>
    <dimen name="chartview_transom_layout_height">12dp</dimen>
    <dimen name="chartview_layout_height">182dp</dimen>
    <dimen name="chartview_trapezoid_radius">5dp</dimen>
    <dimen name="chartview_trapezoid_margin_start">1dp</dimen>
    <dimen name="chartview_trapezoid_margin_bottom">2dp</dimen>
+39 −0
Original line number Diff line number Diff line
@@ -85,6 +85,10 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
    int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
    @VisibleForTesting
    int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
    @VisibleForTesting
    int mDailyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
    @VisibleForTesting
    int mHourlyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;

    private boolean mIs24HourFormat;
    private View mBatteryChartViewGroup;
@@ -217,6 +221,37 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
        refreshUi();
    }

    void onHighlightSlotIndexUpdate(int dailyHighlightSlotIndex, int hourlyHighlightSlotIndex) {
        if (mDailyHighlightSlotIndex == dailyHighlightSlotIndex
                && mHourlyHighlightSlotIndex == hourlyHighlightSlotIndex) {
            return;
        }
        mDailyHighlightSlotIndex = dailyHighlightSlotIndex;
        mHourlyHighlightSlotIndex = hourlyHighlightSlotIndex;
        refreshUi();
    }

    void selectHighlightSlotIndex() {
        if (mDailyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID
                || mHourlyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID) {
            return;
        }
        if (mDailyHighlightSlotIndex == mDailyChartIndex
                && mHourlyHighlightSlotIndex == mHourlyChartIndex) {
            return;
        }
        mDailyChartIndex = mDailyHighlightSlotIndex;
        mHourlyChartIndex = mHourlyHighlightSlotIndex;
        Log.d(TAG, String.format("onDailyChartSelect:%d, onHourlyChartSelect:%d",
                mDailyChartIndex, mHourlyChartIndex));
        refreshUi();
        mHandler.post(() -> mDailyChartView.announceForAccessibility(
                getAccessibilityAnnounceMessage()));
        if (mOnSelectedIndexUpdatedListener != null) {
            mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
        }
    }

    void setBatteryChartView(@NonNull final BatteryChartView dailyChartView,
            @NonNull final BatteryChartView hourlyChartView) {
        final View parentView = (View) dailyChartView.getParent();
@@ -320,6 +355,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
                mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
            }
            mDailyViewModel.setSelectedIndex(mDailyChartIndex);
            mDailyViewModel.setHighlightSlotIndex(mDailyHighlightSlotIndex);
            mDailyChartView.setViewModel(mDailyViewModel);
        }

@@ -334,6 +370,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
                mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
            }
            hourlyViewModel.setSelectedIndex(mHourlyChartIndex);
            hourlyViewModel.setHighlightSlotIndex((mDailyChartIndex == mDailyHighlightSlotIndex)
                    ? mHourlyHighlightSlotIndex
                    : BatteryChartViewModel.SELECTED_INDEX_INVALID);
            mHourlyChartView.setViewModel(hourlyViewModel);
        }
    }
+93 −3
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.ArraySet;
import android.util.AttributeSet;
@@ -90,6 +91,15 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
    private int mTrapezoidHoverColor;
    private int mDefaultTextColor;
    private int mTextPadding;
    private int mTransomIconSize;
    private int mTransomTop;
    private int mTransomViewHeight;
    private int mTransomLineDefaultColor;
    private int mTransomLineSelectedColor;
    private float mTransomPadding;
    private Drawable mTransomIcon;
    private Paint mTransomLinePaint;
    private Paint mTransomSelectedSlotPaint;
    private Paint mDividerPaint;
    private Paint mTrapezoidPaint;
    private Paint mTextPaint;
@@ -123,8 +133,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
            return;
        }

        Log.d(TAG, String.format("setViewModel(): size: %d, selectedIndex: %d.",
                viewModel.size(), viewModel.selectedIndex()));
        Log.d(TAG, String.format(
                "setViewModel(): size: %d, selectedIndex: %d, getHighlightSlotIndex: %d",
                viewModel.size(), viewModel.selectedIndex(), viewModel.getHighlightSlotIndex()));
        mViewModel = viewModel;
        initializeAxisLabelsBounds();
        initializeTrapezoidSlots(viewModel.size() - 1);
@@ -162,7 +173,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
                        mPercentageBounds[index]);
            }
            // Updates the indent configurations.
            mIndent.top = mPercentageBounds[0].height();
            mIndent.top = mPercentageBounds[0].height() + mTransomViewHeight;
            final int textWidth = mPercentageBounds[0].width() + mTextPadding;
            if (isRTL()) {
                mIndent.left = textWidth;
@@ -196,6 +207,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
        }
        drawVerticalDividers(canvas);
        drawTrapezoids(canvas);
        drawTransomLine(canvas);
    }

    @Override
@@ -340,6 +352,40 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
                        resources.getDimensionPixelSize(R.dimen.chartview_trapezoid_radius)));
        // Initializes for drawing text information.
        mTextPadding = resources.getDimensionPixelSize(R.dimen.chartview_text_padding);
        // Initializes the padding top for drawing text information.
        mTransomViewHeight = resources.getDimensionPixelSize(
                R.dimen.chartview_transom_layout_height);
    }

    private void initializeTransomPaint() {
        if (mTransomLinePaint != null && mTransomSelectedSlotPaint != null
                && mTransomIcon != null) {
            return;
        }
        // Initializes the transom line paint.
        final Resources resources = getContext().getResources();
        final int transomLineWidth = resources.getDimensionPixelSize(
                R.dimen.chartview_transom_width);
        final int transomRadius = resources.getDimensionPixelSize(R.dimen.chartview_transom_radius);
        mTransomPadding = transomRadius * .5f;
        mTransomTop = resources.getDimensionPixelSize(R.dimen.chartview_transom_padding_top);
        mTransomLineDefaultColor = Utils.getDisabled(mContext, DIVIDER_COLOR);
        mTransomLineSelectedColor = resources.getColor(
                R.color.color_battery_anomaly_yellow_selector);
        final int slotHighlightColor = Utils.getDisabled(mContext, mTransomLineSelectedColor);
        mTransomIconSize = resources.getDimensionPixelSize(R.dimen.chartview_transom_icon_size);
        mTransomLinePaint = new Paint();
        mTransomLinePaint.setAntiAlias(true);
        mTransomLinePaint.setStyle(Paint.Style.STROKE);
        mTransomLinePaint.setStrokeWidth(transomLineWidth);
        mTransomLinePaint.setStrokeCap(Paint.Cap.ROUND);
        mTransomLinePaint.setPathEffect(new CornerPathEffect(transomRadius));
        mTransomSelectedSlotPaint = new Paint();
        mTransomSelectedSlotPaint.setAntiAlias(true);
        mTransomSelectedSlotPaint.setColor(slotHighlightColor);
        mTransomSelectedSlotPaint.setStyle(Paint.Style.FILL);
        // Get the companion icon beside transom line
        mTransomIcon = getResources().getDrawable(R.drawable.ic_battery_tips_warning_icon);
    }

    private void drawHorizontalDividers(Canvas canvas) {
@@ -592,6 +638,50 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
        }
    }

    private boolean isHighlightSlotValid() {
        return mViewModel != null && mViewModel.getHighlightSlotIndex()
                != BatteryChartViewModel.SELECTED_INDEX_INVALID;
    }

    private void drawTransomLine(Canvas canvas) {
        if (!isHighlightSlotValid()) {
            return;
        }
        initializeTransomPaint();
        // Draw the whole transom line and a warning icon
        mTransomLinePaint.setColor(mTransomLineDefaultColor);
        final int width = getWidth() - abs(mIndent.width());
        final float transomOffset = mTrapezoidHOffset + mDividerWidth * .5f + mTransomPadding;
        final float trapezoidBottom = getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
                - mTrapezoidVOffset;
        canvas.drawLine(mIndent.left + transomOffset, mTransomTop,
                mIndent.left + width - transomOffset, mTransomTop,
                mTransomLinePaint);
        drawTransomIcon(canvas);
        // Draw selected segment of transom line and a highlight slot
        mTransomLinePaint.setColor(mTransomLineSelectedColor);
        final int index = mViewModel.getHighlightSlotIndex();
        final float startX = mTrapezoidSlots[index].mLeft;
        final float endX = mTrapezoidSlots[index].mRight;
        canvas.drawLine(startX + mTransomPadding, mTransomTop,
                endX - mTransomPadding, mTransomTop,
                mTransomLinePaint);
        canvas.drawRect(startX, mTransomTop, endX, trapezoidBottom,
                mTransomSelectedSlotPaint);
    }

    private void drawTransomIcon(Canvas canvas) {
        if (mTransomIcon == null) {
            return;
        }
        final int left = isRTL()
                ? mIndent.left - mTextPadding - mTransomIconSize
                : getWidth() - abs(mIndent.width()) + mTextPadding;
        mTransomIcon.setBounds(left, mTransomTop - mTransomIconSize / 2,
                left + mTransomIconSize, mTransomTop + mTransomIconSize / 2);
        mTransomIcon.draw(canvas);
    }

    // Searches the corresponding trapezoid index from x location.
    private int getTrapezoidIndex(float x) {
        if (mTrapezoidSlots == null) {
+9 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ class BatteryChartViewModel {
    private final String[] mFullTexts;

    private int mSelectedIndex = SELECTED_INDEX_ALL;
    private int mHighlightSlotIndex = SELECTED_INDEX_INVALID;

    BatteryChartViewModel(@NonNull List<Integer> levels, @NonNull List<Long> timestamps,
            @NonNull AxisLabelPosition axisLabelPosition,
@@ -106,6 +107,14 @@ class BatteryChartViewModel {
        mSelectedIndex = index;
    }

    public int getHighlightSlotIndex() {
        return mHighlightSlotIndex;
    }

    public void setHighlightSlotIndex(int index) {
        mHighlightSlotIndex = index;
    }

    @Override
    public int hashCode() {
        return Objects.hash(mLevels, mTimestamps, mSelectedIndex, mAxisLabelPosition);
Loading