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

Commit a2bdafaf authored by mxyyiyi's avatar mxyyiyi
Browse files

[Expressive Battery] Refactor pref with anomaly hint.

- WarningFramePreference & warning_frame_preference.xml is a battery customized layout which looks like a standard Preference layout with an optional app icon & warning chip.
- PowerGaugePreference extends the WarningFramePreference to display the app Preference with optional warning chip in Battery > Battery Usage.
- PowerUsageTimePreference extends the WarningFramePreference to display the usage time with optional warning chip in Battery > Battery Usage > App battery usage.

Bug: 349652542
Test: atest BatteryUsageBreakdownControllerTest PowerGaugePreferenceTest PowerUsageTimeControllerTest
Flag: com.android.settingslib.widget.theme.flags.is_expressive_design_enabled
Change-Id: I5d22703ccc487c54a2bbbc1d9737b92a2de54ba5
parent 8efba3fe
Loading
Loading
Loading
Loading

res/layout/power_usage_time.xml

deleted100644 → 0
+0 −49
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright (C) 2023 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.
-->

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:orientation="vertical">

    <TextView
        android:id="@+id/time_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp"
        android:textAlignment="viewStart"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="?android:attr/textColorPrimary" />

    <TextView
        android:id="@+id/time_summary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginVertical="4dp"
        android:textAlignment="viewStart"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="?android:attr/textColorSecondary" />

    <include layout="@layout/power_anomaly_hints"
        android:visibility="gone"
        android:id="@+id/anomaly_hints"
        android:paddingBottom="20dp"/>

</LinearLayout>
 No newline at end of file
+4 −5
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@
    <include layout="@layout/preference_app"/>

    <LinearLayout
        android:id="@+id/warning_chip"
        android:id="@+id/warning_chip_frame"
        android:visibility="gone"
        android:clickable="false"
        android:layout_width="match_parent"
@@ -32,13 +32,12 @@
        android:orientation="horizontal"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">

        <Space
            android:id="@+id/warning_padding_placeholder"
            android:layout_width="@dimen/secondary_app_icon_size"
            android:layout_height="wrap_content"
            android:layout_height="1px"
            android:layout_marginEnd="16dp"/>

        <include layout="@layout/power_anomaly_hints"/>

    </LinearLayout>
</LinearLayout>
 No newline at end of file
+3 −3
Original line number Diff line number Diff line
@@ -93,10 +93,10 @@ public class PowerUsageTimeController extends BasePreferenceController {
                || (summaryTimeMs == 0 && !TextUtils.equals(anomalyHintKey, preference.getKey()))) {
            return false;
        }
        preference.setTimeTitle(mContext.getString(titleResId));
        preference.setTimeSummary(getPowerUsageTimeInfo(summaryTimeMs));
        preference.setTitle(mContext.getString(titleResId));
        preference.setSummary(getPowerUsageTimeInfo(summaryTimeMs));
        if (TextUtils.equals(anomalyHintKey, preference.getKey())) {
            preference.setAnomalyHint(anomalyHintText);
            preference.setHint(anomalyHintText);
        }
        preference.setVisible(true);
        return true;
+4 −61
Original line number Diff line number Diff line
@@ -17,74 +17,17 @@
package com.android.settings.fuelgauge;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.android.settings.R;
import com.android.settingslib.widget.GroupSectionDividerMixin;

/** Custom preference for displaying the app power usage time. */
public class PowerUsageTimePreference extends Preference {
public class PowerUsageTimePreference extends WarningFramePreference implements
        GroupSectionDividerMixin {
    private static final String TAG = "PowerUsageTimePreference";

    @VisibleForTesting CharSequence mTimeTitle;
    @VisibleForTesting CharSequence mTimeSummary;
    @VisibleForTesting CharSequence mAnomalyHintText;

    public PowerUsageTimePreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setLayoutResource(R.layout.power_usage_time);
    }

    void setTimeTitle(CharSequence timeTitle) {
        if (!TextUtils.equals(mTimeTitle, timeTitle)) {
            mTimeTitle = timeTitle;
            notifyChanged();
        }
    }

    void setTimeSummary(CharSequence timeSummary) {
        if (!TextUtils.equals(mTimeSummary, timeSummary)) {
            mTimeSummary = timeSummary;
            notifyChanged();
        }
    }

    void setAnomalyHint(CharSequence anomalyHintText) {
        if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) {
            mAnomalyHintText = anomalyHintText;
            notifyChanged();
        }
    }

    private void showAnomalyHint(PreferenceViewHolder view) {
        if (TextUtils.isEmpty(mAnomalyHintText)) {
            return;
        }
        final View anomalyHintView = view.findViewById(R.id.anomaly_hints);
        if (anomalyHintView == null) {
            return;
        }
        final TextView warningInfo = anomalyHintView.findViewById(R.id.warning_info);
        if (warningInfo == null) {
            return;
        }
        warningInfo.setText(mAnomalyHintText);
        anomalyHintView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder view) {
        super.onBindViewHolder(view);

        ((TextView) view.findViewById(R.id.time_title)).setText(mTimeTitle);
        ((TextView) view.findViewById(R.id.time_summary)).setText(mTimeSummary);

        showAnomalyHint(view);
        setSelectable(false);
    }
}
+79 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 * Copyright (C) 2025 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.
@@ -14,48 +14,66 @@
 * limitations under the License.
 */

package com.android.settings.fuelgauge.batteryusage;
package com.android.settings.fuelgauge;

import android.annotation.Nullable;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Space;
import android.widget.TextView;

import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.android.settings.R;
import com.android.settingslib.Utils;

class AnomalyAppItemPreference extends PowerGaugePreference {

    private static final String TAG = "AnomalyAppItemPreference";
/**
 * Custom preference for displaying the {@link Preference} with an optional hint chip.
 */
public class WarningFramePreference extends Preference {
    private final int mTitleColorNormal;
    private final int mSummaryColorNormal;

    private CharSequence mAnomalyHintText;
    @Nullable private CharSequence mHintText;

    AnomalyAppItemPreference(Context context) {
        super(context, /* attrs */ null);
        setLayoutResource(R.layout.anomaly_app_item_preference);
    public WarningFramePreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setLayoutResource(R.layout.warning_frame_preference);
        mTitleColorNormal =
                Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary);
        mSummaryColorNormal =
                Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
    }

    void setAnomalyHint(@Nullable CharSequence anomalyHintText) {
        if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) {
            mAnomalyHintText = anomalyHintText;
    /** Sets the text of hint to show. */
    public void setHint(@Nullable CharSequence hintText) {
        if (!TextUtils.equals(mHintText, hintText)) {
            mHintText = hintText;
            notifyChanged();
        }
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder viewHolder) {
        super.onBindViewHolder(viewHolder);
        final LinearLayout warningChipView =
                (LinearLayout) viewHolder.findViewById(R.id.warning_chip);

        if (!TextUtils.isEmpty(mAnomalyHintText)) {
            ((TextView) warningChipView.findViewById(R.id.warning_info)).setText(mAnomalyHintText);
            warningChipView.setVisibility(View.VISIBLE);
    public void onBindViewHolder(PreferenceViewHolder view) {
        super.onBindViewHolder(view);

        final LinearLayout warningChipFrame =
                (LinearLayout) view.findViewById(R.id.warning_chip_frame);
        final Space warningPaddingPlaceHolder =
                warningChipFrame.findViewById(R.id.warning_padding_placeholder);
        warningPaddingPlaceHolder.setVisibility(getIcon() != null ? View.VISIBLE : View.GONE);
        if (!TextUtils.isEmpty(mHintText)) {
            ((TextView) warningChipFrame.findViewById(R.id.warning_info)).setText(mHintText);
            warningChipFrame.setVisibility(View.VISIBLE);
        } else {
            warningChipView.setVisibility(View.GONE);
            warningChipFrame.setVisibility(View.GONE);
        }
        ((TextView) view.findViewById(android.R.id.title)).setTextColor(mTitleColorNormal);
        ((TextView) view.findViewById(android.R.id.summary)).setTextColor(mSummaryColorNormal);
    }
}
Loading