Merge "Migrate Tips Card in battery uasge to Settings Card." into main
This commit is contained in:
committed by
Android (Google) Code Review
commit
93b093033a
@@ -28,10 +28,11 @@ import androidx.annotation.Nullable;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
import com.android.settings.widget.TipCardPreference;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
final class AnomalyEventWrapper {
|
||||
class AnomalyEventWrapper {
|
||||
private static final String TAG = "AnomalyEventWrapper";
|
||||
|
||||
private final Context mContext;
|
||||
@@ -235,16 +236,16 @@ final class AnomalyEventWrapper {
|
||||
return mHighlightSlotPair;
|
||||
}
|
||||
|
||||
boolean updateTipsCardPreference(BatteryTipsCardPreference preference) {
|
||||
boolean updateTipsCardPreference(TipCardPreference preference) {
|
||||
final String titleString = getTitleString();
|
||||
if (TextUtils.isEmpty(titleString)) {
|
||||
return false;
|
||||
}
|
||||
preference.setTitle(titleString);
|
||||
preference.setIconResourceId(getIconResId());
|
||||
preference.setButtonColorResourceId(getColorResId());
|
||||
preference.setMainButtonLabel(getMainBtnString());
|
||||
preference.setDismissButtonLabel(getDismissBtnString());
|
||||
preference.setIconResId(getIconResId());
|
||||
preference.setTintColorResId(getColorResId());
|
||||
preference.setPrimaryButtonText(getDismissBtnString());
|
||||
preference.setSecondaryButtonText(getMainBtnString());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,150 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.android.settings.fuelgauge.batteryusage;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
|
||||
/** A preference for displaying the battery tips card view. */
|
||||
public class BatteryTipsCardPreference extends Preference implements View.OnClickListener {
|
||||
|
||||
private static final String TAG = "BatteryTipsCardPreference";
|
||||
|
||||
interface OnConfirmListener {
|
||||
void onConfirm();
|
||||
}
|
||||
|
||||
interface OnRejectListener {
|
||||
void onReject();
|
||||
}
|
||||
|
||||
private OnConfirmListener mOnConfirmListener;
|
||||
private OnRejectListener mOnRejectListener;
|
||||
private int mIconResourceId = 0;
|
||||
private int mButtonColorResourceId = 0;
|
||||
|
||||
@VisibleForTesting CharSequence mMainButtonLabel;
|
||||
@VisibleForTesting CharSequence mDismissButtonLabel;
|
||||
|
||||
public BatteryTipsCardPreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setLayoutResource(R.layout.battery_tips_card);
|
||||
setViewId(R.id.battery_tips_card);
|
||||
setSelectable(false);
|
||||
}
|
||||
|
||||
public void setOnConfirmListener(OnConfirmListener listener) {
|
||||
mOnConfirmListener = listener;
|
||||
}
|
||||
|
||||
public void setOnRejectListener(OnRejectListener listener) {
|
||||
mOnRejectListener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the icon in tips card.
|
||||
*/
|
||||
public void setIconResourceId(int resourceId) {
|
||||
if (mIconResourceId != resourceId) {
|
||||
mIconResourceId = resourceId;
|
||||
notifyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the background color for main button and the text color for dismiss button.
|
||||
*/
|
||||
public void setButtonColorResourceId(int resourceId) {
|
||||
if (mButtonColorResourceId != resourceId) {
|
||||
mButtonColorResourceId = resourceId;
|
||||
notifyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the label of main button in tips card.
|
||||
*/
|
||||
public void setMainButtonLabel(CharSequence label) {
|
||||
if (!TextUtils.equals(mMainButtonLabel, label)) {
|
||||
mMainButtonLabel = label;
|
||||
notifyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the label of dismiss button in tips card.
|
||||
*/
|
||||
public void setDismissButtonLabel(CharSequence label) {
|
||||
if (!TextUtils.equals(mDismissButtonLabel, label)) {
|
||||
mDismissButtonLabel = label;
|
||||
notifyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
final int viewId = view.getId();
|
||||
if (viewId == R.id.main_button || viewId == R.id.battery_tips_card) {
|
||||
if (mOnConfirmListener != null) {
|
||||
mOnConfirmListener.onConfirm();
|
||||
}
|
||||
} else if (viewId == R.id.dismiss_button) {
|
||||
if (mOnRejectListener != null) {
|
||||
mOnRejectListener.onReject();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(PreferenceViewHolder view) {
|
||||
super.onBindViewHolder(view);
|
||||
|
||||
((TextView) view.findViewById(R.id.title)).setText(getTitle());
|
||||
|
||||
final LinearLayout tipsCard = (LinearLayout) view.findViewById(R.id.battery_tips_card);
|
||||
tipsCard.setOnClickListener(this);
|
||||
final MaterialButton mainButton = (MaterialButton) view.findViewById(R.id.main_button);
|
||||
mainButton.setOnClickListener(this);
|
||||
mainButton.setText(mMainButtonLabel);
|
||||
final MaterialButton dismissButton =
|
||||
(MaterialButton) view.findViewById(R.id.dismiss_button);
|
||||
dismissButton.setOnClickListener(this);
|
||||
dismissButton.setText(mDismissButtonLabel);
|
||||
if (mButtonColorResourceId != 0) {
|
||||
final int colorInt = getContext().getColor(mButtonColorResourceId);
|
||||
mainButton.setBackgroundColor(colorInt);
|
||||
dismissButton.setTextColor(colorInt);
|
||||
}
|
||||
|
||||
if (mIconResourceId != 0) {
|
||||
((ImageView) view.findViewById(R.id.icon)).setImageResource(mIconResourceId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import androidx.preference.PreferenceScreen;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.widget.TipCardPreference;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
/** Controls the update for battery tips card */
|
||||
@@ -50,10 +51,9 @@ public class BatteryTipsController extends BasePreferenceController {
|
||||
void onAnomalyReject();
|
||||
}
|
||||
|
||||
private OnAnomalyConfirmListener mOnAnomalyConfirmListener;
|
||||
private OnAnomalyRejectListener mOnAnomalyRejectListener;
|
||||
|
||||
@VisibleForTesting BatteryTipsCardPreference mCardPreference;
|
||||
@VisibleForTesting OnAnomalyConfirmListener mOnAnomalyConfirmListener;
|
||||
@VisibleForTesting OnAnomalyRejectListener mOnAnomalyRejectListener;
|
||||
@VisibleForTesting TipCardPreference mCardPreference;
|
||||
@VisibleForTesting AnomalyEventWrapper mAnomalyEventWrapper = null;
|
||||
@VisibleForTesting Boolean mIsAcceptable = false;
|
||||
|
||||
@@ -117,42 +117,20 @@ public class BatteryTipsController extends BasePreferenceController {
|
||||
return;
|
||||
}
|
||||
|
||||
// Set battery tips card listener
|
||||
mCardPreference.setOnConfirmListener(
|
||||
mCardPreference.setPrimaryButtonAction(
|
||||
() -> {
|
||||
mCardPreference.setVisible(false);
|
||||
if (mOnAnomalyConfirmListener != null) {
|
||||
mOnAnomalyConfirmListener.onAnomalyConfirm();
|
||||
} else if (mAnomalyEventWrapper.updateSystemSettingsIfAvailable()
|
||||
|| mAnomalyEventWrapper.launchSubSetting()) {
|
||||
mMetricsFeatureProvider.action(
|
||||
/* attribution= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* action= */ SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
|
||||
/* pageId= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* key= */ ANOMALY_KEY,
|
||||
/* value= */ anomalyKeyNumber);
|
||||
}
|
||||
onBatteryTipsCardDismiss(anomalyKeyNumber);
|
||||
return null;
|
||||
});
|
||||
mCardPreference.setOnRejectListener(
|
||||
mCardPreference.setSecondaryButtonAction(
|
||||
() -> {
|
||||
mCardPreference.setVisible(false);
|
||||
if (mOnAnomalyRejectListener != null) {
|
||||
mOnAnomalyRejectListener.onAnomalyReject();
|
||||
}
|
||||
// For anomaly events with same record key, dismissed until next time full
|
||||
// charged.
|
||||
final String dismissRecordKey = mAnomalyEventWrapper.getDismissRecordKey();
|
||||
if (!TextUtils.isEmpty(dismissRecordKey)) {
|
||||
DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, dismissRecordKey);
|
||||
}
|
||||
mMetricsFeatureProvider.action(
|
||||
/* attribution= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* action= */ SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS,
|
||||
/* pageId= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* key= */ ANOMALY_KEY,
|
||||
/* value= */ anomalyKeyNumber);
|
||||
onBatteryTipsCardAccept(anomalyKeyNumber);
|
||||
return null;
|
||||
});
|
||||
|
||||
mCardPreference.setPrimaryButtonVisibility(true);
|
||||
mCardPreference.setSecondaryButtonVisibility(true);
|
||||
mCardPreference.buildContent();
|
||||
mCardPreference.setVisible(true);
|
||||
mMetricsFeatureProvider.action(
|
||||
/* attribution= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
@@ -161,4 +139,37 @@ public class BatteryTipsController extends BasePreferenceController {
|
||||
/* key= */ ANOMALY_KEY,
|
||||
/* value= */ anomalyKeyNumber);
|
||||
}
|
||||
|
||||
private void onBatteryTipsCardDismiss(final int anomalyKeyNumber) {
|
||||
mCardPreference.setVisible(false);
|
||||
if (mOnAnomalyRejectListener != null) {
|
||||
mOnAnomalyRejectListener.onAnomalyReject();
|
||||
}
|
||||
// For anomaly events with same record key, dismissed until next time full charged.
|
||||
final String dismissRecordKey = mAnomalyEventWrapper.getDismissRecordKey();
|
||||
if (!TextUtils.isEmpty(dismissRecordKey)) {
|
||||
DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, dismissRecordKey);
|
||||
}
|
||||
mMetricsFeatureProvider.action(
|
||||
/* attribution= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* action= */ SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS,
|
||||
/* pageId= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* key= */ ANOMALY_KEY,
|
||||
/* value= */ anomalyKeyNumber);
|
||||
}
|
||||
|
||||
private void onBatteryTipsCardAccept(final int anomalyKeyNumber) {
|
||||
mCardPreference.setVisible(false);
|
||||
if (mOnAnomalyConfirmListener != null) {
|
||||
mOnAnomalyConfirmListener.onAnomalyConfirm();
|
||||
} else if (mAnomalyEventWrapper.updateSystemSettingsIfAvailable()
|
||||
|| mAnomalyEventWrapper.launchSubSetting()) {
|
||||
mMetricsFeatureProvider.action(
|
||||
/* attribution= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* action= */ SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
|
||||
/* pageId= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
/* key= */ ANOMALY_KEY,
|
||||
/* value= */ anomalyKeyNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.android.settings.widget
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.util.AttributeSet
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.res.vectorResource
|
||||
import com.android.settings.spa.preference.ComposePreference
|
||||
@@ -37,6 +38,9 @@ constructor(
|
||||
/** A icon resource id for displaying icon on tips card. */
|
||||
var iconResId: Int? = null
|
||||
|
||||
/** A color resource id for displaying icon and button text on tips card. */
|
||||
var tintColorResId: Int? = null
|
||||
|
||||
/** The primary button's text. */
|
||||
var primaryButtonText: String = ""
|
||||
|
||||
@@ -85,6 +89,8 @@ constructor(
|
||||
title = title?.toString() ?: "",
|
||||
text = summary?.toString() ?: "",
|
||||
buttons = listOfNotNull(configPrimaryButton(), configSecondaryButton()),
|
||||
tintColor = tintColorResId?.let { Color(context.getColor(it)) }
|
||||
?: Color.Unspecified,
|
||||
onDismiss = onDismiss,
|
||||
imageVector =
|
||||
iconResId
|
||||
|
||||
Reference in New Issue
Block a user