Merge "Add ability to see both battery estimates on long press"
This commit is contained in:
committed by
Android (Google) Code Review
commit
90ef8cea69
@@ -48,6 +48,12 @@
|
|||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="12dp"
|
||||||
android:textAppearance="@android:style/TextAppearance.Material.Small"/>
|
android:textAppearance="@android:style/TextAppearance.Material.Small"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/summary2"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textAppearance="@android:style/TextAppearance.Material.Small"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<com.android.settings.fuelgauge.BatteryMeterView
|
<com.android.settings.fuelgauge.BatteryMeterView
|
||||||
|
@@ -88,7 +88,7 @@ public class LayoutPreference extends Preference {
|
|||||||
layout.addView(mRootView);
|
layout.addView(mRootView);
|
||||||
}
|
}
|
||||||
|
|
||||||
public View findViewById(int id) {
|
public <T extends View> T findViewById(int id) {
|
||||||
return mRootView.findViewById(id);
|
return mRootView.findViewById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -48,7 +48,9 @@ public class BatteryHeaderPreferenceController extends PreferenceController
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
TextView mTimeText;
|
TextView mTimeText;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
TextView mSummary;
|
TextView mSummary1;
|
||||||
|
@VisibleForTesting
|
||||||
|
TextView mSummary2;
|
||||||
|
|
||||||
private final Activity mActivity;
|
private final Activity mActivity;
|
||||||
private final PreferenceFragment mHost;
|
private final PreferenceFragment mHost;
|
||||||
@@ -73,8 +75,9 @@ public class BatteryHeaderPreferenceController extends PreferenceController
|
|||||||
mBatteryLayoutPref = (LayoutPreference) screen.findPreference(KEY_BATTERY_HEADER);
|
mBatteryLayoutPref = (LayoutPreference) screen.findPreference(KEY_BATTERY_HEADER);
|
||||||
mBatteryMeterView = (BatteryMeterView) mBatteryLayoutPref
|
mBatteryMeterView = (BatteryMeterView) mBatteryLayoutPref
|
||||||
.findViewById(R.id.battery_header_icon);
|
.findViewById(R.id.battery_header_icon);
|
||||||
mTimeText = (TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent);
|
mTimeText = mBatteryLayoutPref.findViewById(R.id.battery_percent);
|
||||||
mSummary = (TextView) mBatteryLayoutPref.findViewById(R.id.summary1);
|
mSummary1 = mBatteryLayoutPref.findViewById(R.id.summary1);
|
||||||
|
mSummary2 = mBatteryLayoutPref.findViewById(R.id.summary2);
|
||||||
|
|
||||||
Intent batteryBroadcast = mContext.registerReceiver(null,
|
Intent batteryBroadcast = mContext.registerReceiver(null,
|
||||||
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
@@ -105,10 +108,13 @@ public class BatteryHeaderPreferenceController extends PreferenceController
|
|||||||
public void updateHeaderPreference(BatteryInfo info) {
|
public void updateHeaderPreference(BatteryInfo info) {
|
||||||
mTimeText.setText(Utils.formatPercentage(info.batteryLevel));
|
mTimeText.setText(Utils.formatPercentage(info.batteryLevel));
|
||||||
if (info.remainingLabel == null) {
|
if (info.remainingLabel == null) {
|
||||||
mSummary.setText(info.statusLabel);
|
mSummary1.setText(info.statusLabel);
|
||||||
} else {
|
} else {
|
||||||
mSummary.setText(info.remainingLabel);
|
mSummary1.setText(info.remainingLabel);
|
||||||
}
|
}
|
||||||
|
// Clear this just to be sure we don't get UI jank on re-entering this view from another
|
||||||
|
// activity.
|
||||||
|
mSummary2.setText("");
|
||||||
|
|
||||||
mBatteryMeterView.setBatteryLevel(info.batteryLevel);
|
mBatteryMeterView.setBatteryLevel(info.batteryLevel);
|
||||||
mBatteryMeterView.setCharging(!info.discharging);
|
mBatteryMeterView.setCharging(!info.discharging);
|
||||||
|
@@ -30,7 +30,6 @@ import android.text.format.Formatter;
|
|||||||
import android.util.SparseIntArray;
|
import android.util.SparseIntArray;
|
||||||
|
|
||||||
import com.android.internal.os.BatteryStatsHelper;
|
import com.android.internal.os.BatteryStatsHelper;
|
||||||
|
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settingslib.R;
|
import com.android.settingslib.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
68
src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
Normal file
68
src/com/android/settings/fuelgauge/DebugEstimatesLoader.java
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.BatteryStats;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
import com.android.internal.os.BatteryStatsHelper;
|
||||||
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
import com.android.settings.utils.AsyncLoader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DebugEstimatesLoader extends AsyncLoader<List<BatteryInfo>> {
|
||||||
|
private BatteryStatsHelper mStatsHelper;
|
||||||
|
|
||||||
|
public DebugEstimatesLoader(Context context, BatteryStatsHelper statsHelper) {
|
||||||
|
super(context);
|
||||||
|
mStatsHelper = statsHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDiscardResult(List<BatteryInfo> result) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BatteryInfo> loadInBackground() {
|
||||||
|
Context context = getContext();
|
||||||
|
PowerUsageFeatureProvider powerUsageFeatureProvider =
|
||||||
|
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
|
||||||
|
|
||||||
|
// get stuff we'll need for both BatteryInfo
|
||||||
|
BatteryUtils batteryUtils = BatteryUtils.getInstance(context);
|
||||||
|
final long elapsedRealtimeUs = batteryUtils.convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
|
Intent batteryBroadcast = getContext().registerReceiver(null,
|
||||||
|
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
|
BatteryStats stats = mStatsHelper.getStats();
|
||||||
|
|
||||||
|
BatteryInfo oldinfo = BatteryInfo.getBatteryInfoOld(getContext(), batteryBroadcast,
|
||||||
|
stats, elapsedRealtimeUs, false);
|
||||||
|
|
||||||
|
final long timeRemainingEnhanced = batteryUtils.convertMsToUs(
|
||||||
|
powerUsageFeatureProvider.getEnhancedBatteryPrediction(getContext()));
|
||||||
|
BatteryInfo newinfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats,
|
||||||
|
elapsedRealtimeUs, false, timeRemainingEnhanced, true);
|
||||||
|
|
||||||
|
List<BatteryInfo> infos = new ArrayList<>();
|
||||||
|
infos.add(oldinfo);
|
||||||
|
infos.add(newinfo);
|
||||||
|
return infos;
|
||||||
|
}
|
||||||
|
}
|
@@ -91,4 +91,25 @@ public interface PowerUsageFeatureProvider {
|
|||||||
* Check whether a specific anomaly detector is enabled
|
* Check whether a specific anomaly detector is enabled
|
||||||
*/
|
*/
|
||||||
boolean isAnomalyDetectorEnabled(@Anomaly.AnomalyType int type);
|
boolean isAnomalyDetectorEnabled(@Anomaly.AnomalyType int type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether debugging should be enabled for battery estimates.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean isEstimateDebugEnabled();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the provided string containing the remaining time into a debug string for enhanced
|
||||||
|
* estimates.
|
||||||
|
* @param timeRemaining
|
||||||
|
* @return A string containing the estimate and a label indicating it is an enhanced estimate
|
||||||
|
*/
|
||||||
|
String getEnhancedEstimateDebugString(String timeRemaining);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the provided string containing the remaining time into a debug string.
|
||||||
|
* @param timeRemaining
|
||||||
|
* @return A string containing the estimate and a label indicating it is a normal estimate
|
||||||
|
*/
|
||||||
|
String getOldEstimateDebugString(String timeRemaining);
|
||||||
}
|
}
|
||||||
|
@@ -117,4 +117,19 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
|
|||||||
public boolean isAnomalyDetectorEnabled(@Anomaly.AnomalyType int type) {
|
public boolean isAnomalyDetectorEnabled(@Anomaly.AnomalyType int type) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEnhancedEstimateDebugString(String timeRemaining) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEstimateDebugEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getOldEstimateDebugString(String timeRemaining) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,7 @@ package com.android.settings.fuelgauge;
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.LoaderManager;
|
import android.app.LoaderManager;
|
||||||
|
import android.app.LoaderManager.LoaderCallbacks;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Loader;
|
import android.content.Loader;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
@@ -35,12 +36,16 @@ import android.support.v7.preference.Preference;
|
|||||||
import android.support.v7.preference.PreferenceGroup;
|
import android.support.v7.preference.PreferenceGroup;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
import android.text.format.Formatter;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
|
import android.view.View.OnLongClickListener;
|
||||||
|
import android.widget.TextView;
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.internal.os.BatterySipper;
|
import com.android.internal.os.BatterySipper;
|
||||||
import com.android.internal.os.BatterySipper.DrainType;
|
import com.android.internal.os.BatterySipper.DrainType;
|
||||||
@@ -58,12 +63,11 @@ import com.android.settings.display.AutoBrightnessPreferenceController;
|
|||||||
import com.android.settings.display.BatteryPercentagePreferenceController;
|
import com.android.settings.display.BatteryPercentagePreferenceController;
|
||||||
import com.android.settings.display.TimeoutPreferenceController;
|
import com.android.settings.display.TimeoutPreferenceController;
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
|
import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment.AnomalyDialogListener;
|
||||||
import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
|
import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
|
||||||
import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
|
import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -73,7 +77,7 @@ import java.util.List;
|
|||||||
* consumed since the last time it was unplugged.
|
* consumed since the last time it was unplugged.
|
||||||
*/
|
*/
|
||||||
public class PowerUsageSummary extends PowerUsageBase implements
|
public class PowerUsageSummary extends PowerUsageBase implements
|
||||||
AnomalyDialogFragment.AnomalyDialogListener {
|
AnomalyDialogListener, OnLongClickListener, OnClickListener {
|
||||||
|
|
||||||
static final String TAG = "PowerUsageSummary";
|
static final String TAG = "PowerUsageSummary";
|
||||||
|
|
||||||
@@ -104,6 +108,7 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final int MENU_TOGGLE_APPS = Menu.FIRST + 5;
|
static final int MENU_TOGGLE_APPS = Menu.FIRST + 5;
|
||||||
private static final int MENU_HELP = Menu.FIRST + 6;
|
private static final int MENU_HELP = Menu.FIRST + 6;
|
||||||
|
public static final int DEBUG_INFO_LOADER = 3;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean mShowAllApps = false;
|
boolean mShowAllApps = false;
|
||||||
@@ -115,15 +120,15 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
PowerUsageFeatureProvider mPowerFeatureProvider;
|
PowerUsageFeatureProvider mPowerFeatureProvider;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
BatteryUtils mBatteryUtils;
|
BatteryUtils mBatteryUtils;
|
||||||
|
@VisibleForTesting
|
||||||
|
LayoutPreference mBatteryLayoutPref;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SparseArray that maps uid to {@link Anomaly}, so we could find {@link Anomaly} by uid
|
* SparseArray that maps uid to {@link Anomaly}, so we could find {@link Anomaly} by uid
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
SparseArray<List<Anomaly>> mAnomalySparseArray;
|
SparseArray<List<Anomaly>> mAnomalySparseArray;
|
||||||
|
|
||||||
private BatteryHeaderPreferenceController mBatteryHeaderPreferenceController;
|
private BatteryHeaderPreferenceController mBatteryHeaderPreferenceController;
|
||||||
private LayoutPreference mBatteryLayoutPref;
|
|
||||||
private PreferenceGroup mAppListGroup;
|
private PreferenceGroup mAppListGroup;
|
||||||
private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
|
private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
|
||||||
private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
|
private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
|
||||||
@@ -152,7 +157,7 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
};
|
};
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
LoaderManager.LoaderCallbacks<BatteryInfo> BatteryInfoLoaderCallbacks =
|
LoaderManager.LoaderCallbacks<BatteryInfo> mBatteryInfoLoaderCallbacks =
|
||||||
new LoaderManager.LoaderCallbacks<BatteryInfo>() {
|
new LoaderManager.LoaderCallbacks<BatteryInfo>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -171,12 +176,61 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LoaderManager.LoaderCallbacks<List<BatteryInfo>> mBatteryInfoDebugLoaderCallbacks =
|
||||||
|
new LoaderCallbacks<List<BatteryInfo>>() {
|
||||||
|
@Override
|
||||||
|
public Loader<List<BatteryInfo>> onCreateLoader(int i, Bundle bundle) {
|
||||||
|
return new DebugEstimatesLoader(getContext(), mStatsHelper);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoadFinished(Loader<List<BatteryInfo>> loader,
|
||||||
|
List<BatteryInfo> batteryInfos) {
|
||||||
|
final BatteryMeterView batteryView = (BatteryMeterView) mBatteryLayoutPref
|
||||||
|
.findViewById(R.id.battery_header_icon);
|
||||||
|
final TextView percentRemaining =
|
||||||
|
mBatteryLayoutPref.findViewById(R.id.battery_percent);
|
||||||
|
final TextView summary1 = mBatteryLayoutPref.findViewById(R.id.summary1);
|
||||||
|
final TextView summary2 = mBatteryLayoutPref.findViewById(R.id.summary2);
|
||||||
|
BatteryInfo oldInfo = batteryInfos.get(0);
|
||||||
|
BatteryInfo newInfo = batteryInfos.get(1);
|
||||||
|
percentRemaining.setText(Utils.formatPercentage(oldInfo.batteryLevel));
|
||||||
|
|
||||||
|
// set the text to the old estimate (copied from battery info). Note that this
|
||||||
|
// can sometimes say 0 time remaining because battery stats requires the phone
|
||||||
|
// be unplugged for a period of time before being willing ot make an estimate.
|
||||||
|
summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString(
|
||||||
|
Formatter.formatShortElapsedTime(getContext(),
|
||||||
|
mBatteryUtils.convertUsToMs(oldInfo.remainingTimeUs))));
|
||||||
|
|
||||||
|
// for this one we can just set the string directly
|
||||||
|
summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString(
|
||||||
|
Formatter.formatShortElapsedTime(getContext(),
|
||||||
|
mBatteryUtils.convertUsToMs(newInfo.remainingTimeUs))));
|
||||||
|
|
||||||
|
batteryView.setBatteryLevel(oldInfo.batteryLevel);
|
||||||
|
batteryView.setCharging(!oldInfo.discharging);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoaderReset(Loader<List<BatteryInfo>> loader) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
setAnimationAllowed(true);
|
setAnimationAllowed(true);
|
||||||
|
|
||||||
|
initFeatureProvider();
|
||||||
mBatteryLayoutPref = (LayoutPreference) findPreference(KEY_BATTERY_HEADER);
|
mBatteryLayoutPref = (LayoutPreference) findPreference(KEY_BATTERY_HEADER);
|
||||||
|
View header = mBatteryLayoutPref.findViewById(R.id.summary1);
|
||||||
|
// Unfortunately setting a long click listener on a means it will no longer pass the regular
|
||||||
|
// click event to the parent, so we have to register a regular click listener as well.
|
||||||
|
if (mPowerFeatureProvider.isEstimateDebugEnabled()) {
|
||||||
|
header.setOnLongClickListener(this);
|
||||||
|
header.setOnClickListener(this);
|
||||||
|
}
|
||||||
mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
|
mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
|
||||||
mScreenUsagePref = (PowerGaugePreference) findPreference(KEY_SCREEN_USAGE);
|
mScreenUsagePref = (PowerGaugePreference) findPreference(KEY_SCREEN_USAGE);
|
||||||
mLastFullChargePref = (PowerGaugePreference) findPreference(
|
mLastFullChargePref = (PowerGaugePreference) findPreference(
|
||||||
@@ -187,7 +241,6 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
mBatteryUtils = BatteryUtils.getInstance(getContext());
|
mBatteryUtils = BatteryUtils.getInstance(getContext());
|
||||||
mAnomalySparseArray = new SparseArray<>();
|
mAnomalySparseArray = new SparseArray<>();
|
||||||
|
|
||||||
initFeatureProvider();
|
|
||||||
restartBatteryInfoLoader();
|
restartBatteryInfoLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,8 +358,7 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION);
|
MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION);
|
||||||
return true;
|
return true;
|
||||||
case MENU_ADDITIONAL_BATTERY_INFO:
|
case MENU_ADDITIONAL_BATTERY_INFO:
|
||||||
startActivity(FeatureFactory.getFactory(getContext())
|
startActivity(mPowerFeatureProvider
|
||||||
.getPowerUsageFeatureProvider(getContext())
|
|
||||||
.getAdditionalBatteryInfoIntent());
|
.getAdditionalBatteryInfoIntent());
|
||||||
metricsFeatureProvider.action(context,
|
metricsFeatureProvider.action(context,
|
||||||
MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_USAGE_ALERTS);
|
MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_USAGE_ALERTS);
|
||||||
@@ -335,11 +387,7 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void performBatteryHeaderClick() {
|
private void performBatteryHeaderClick() {
|
||||||
final Context context = getContext();
|
if (mPowerFeatureProvider.isAdvancedUiEnabled()) {
|
||||||
final PowerUsageFeatureProvider featureProvider = FeatureFactory.getFactory(context)
|
|
||||||
.getPowerUsageFeatureProvider(context);
|
|
||||||
|
|
||||||
if (featureProvider.isAdvancedUiEnabled()) {
|
|
||||||
Utils.startWithFragment(getContext(), PowerUsageAdvanced.class.getName(), null,
|
Utils.startWithFragment(getContext(), PowerUsageAdvanced.class.getName(), null,
|
||||||
null, 0, R.string.advanced_battery_title, null, getMetricsCategory());
|
null, 0, R.string.advanced_battery_title, null, getMetricsCategory());
|
||||||
} else {
|
} else {
|
||||||
@@ -617,6 +665,17 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
timeSequence));
|
timeSequence));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void showBothEstimates() {
|
||||||
|
final Context context = getContext();
|
||||||
|
if (context == null
|
||||||
|
|| !mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(context)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
getLoaderManager().restartLoader(DEBUG_INFO_LOADER, Bundle.EMPTY,
|
||||||
|
mBatteryInfoDebugLoaderCallbacks);
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
double calculatePercentage(double powerUsage, double dischargeAmount) {
|
double calculatePercentage(double powerUsage, double dischargeAmount) {
|
||||||
final double totalPower = mStatsHelper.getTotalPower();
|
final double totalPower = mStatsHelper.getTotalPower();
|
||||||
@@ -678,7 +737,7 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
if (mPowerFeatureProvider != null
|
if (mPowerFeatureProvider != null
|
||||||
&& mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(getContext())) {
|
&& mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(getContext())) {
|
||||||
getLoaderManager().restartLoader(BATTERY_INFO_LOADER, Bundle.EMPTY,
|
getLoaderManager().restartLoader(BATTERY_INFO_LOADER, Bundle.EMPTY,
|
||||||
BatteryInfoLoaderCallbacks);
|
mBatteryInfoLoaderCallbacks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -753,6 +812,18 @@ public class PowerUsageSummary extends PowerUsageBase implements
|
|||||||
mAnomalySummaryPreferenceController.hideHighUsagePreference();
|
mAnomalySummaryPreferenceController.hideHighUsagePreference();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View view) {
|
||||||
|
showBothEstimates();
|
||||||
|
view.setOnLongClickListener(null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
performBatteryHeaderClick();
|
||||||
|
}
|
||||||
|
|
||||||
private static class SummaryProvider implements SummaryLoader.SummaryProvider {
|
private static class SummaryProvider implements SummaryLoader.SummaryProvider {
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final SummaryLoader mLoader;
|
private final SummaryLoader mLoader;
|
||||||
|
@@ -83,6 +83,7 @@ public class BatteryHeaderPreferenceControllerTest {
|
|||||||
private BatteryMeterView mBatteryMeterView;
|
private BatteryMeterView mBatteryMeterView;
|
||||||
private TextView mTimeText;
|
private TextView mTimeText;
|
||||||
private TextView mSummary;
|
private TextView mSummary;
|
||||||
|
private TextView mSummary2;
|
||||||
private LayoutPreference mBatteryLayoutPref;
|
private LayoutPreference mBatteryLayoutPref;
|
||||||
private Intent mBatteryIntent;
|
private Intent mBatteryIntent;
|
||||||
private Lifecycle mLifecycle;
|
private Lifecycle mLifecycle;
|
||||||
@@ -97,6 +98,7 @@ public class BatteryHeaderPreferenceControllerTest {
|
|||||||
mTimeText = new TextView(mContext);
|
mTimeText = new TextView(mContext);
|
||||||
mSummary = new TextView(mContext);
|
mSummary = new TextView(mContext);
|
||||||
ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
|
ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
|
||||||
|
mSummary2 = new TextView(mContext);
|
||||||
|
|
||||||
mBatteryIntent = new Intent();
|
mBatteryIntent = new Intent();
|
||||||
mBatteryIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_LEVEL);
|
mBatteryIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_LEVEL);
|
||||||
@@ -113,7 +115,8 @@ public class BatteryHeaderPreferenceControllerTest {
|
|||||||
mContext, mActivity, mPreferenceFragment, mLifecycle);
|
mContext, mActivity, mPreferenceFragment, mLifecycle);
|
||||||
mController.mBatteryMeterView = mBatteryMeterView;
|
mController.mBatteryMeterView = mBatteryMeterView;
|
||||||
mController.mTimeText = mTimeText;
|
mController.mTimeText = mTimeText;
|
||||||
mController.mSummary = mSummary;
|
mController.mSummary1 = mSummary;
|
||||||
|
mController.mSummary2 = mSummary2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
|
import android.view.View;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.robolectric.Robolectric;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import android.app.LoaderManager;
|
import android.app.LoaderManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -106,6 +108,8 @@ public class PowerUsageSummaryTest {
|
|||||||
private static final double POWER_USAGE_PERCENTAGE = 50;
|
private static final double POWER_USAGE_PERCENTAGE = 50;
|
||||||
private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
|
private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
|
||||||
new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
|
new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
|
||||||
|
public static final String NEW_ML_EST_SUFFIX = "(New ML est)";
|
||||||
|
public static final String OLD_EST_SUFFIX = "(Old est)";
|
||||||
|
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -450,6 +454,18 @@ public class PowerUsageSummaryTest {
|
|||||||
any());
|
any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testShowBothEstimates_summariesAreBothModified() {
|
||||||
|
doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary2);
|
||||||
|
doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary1);
|
||||||
|
mFragment.onLongClick(new View(mRealContext));
|
||||||
|
TextView summary1 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary1);
|
||||||
|
TextView summary2 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary2);
|
||||||
|
Robolectric.flushBackgroundThreadScheduler();
|
||||||
|
assertThat(summary2.getText().toString().contains(NEW_ML_EST_SUFFIX));
|
||||||
|
assertThat(summary1.getText().toString().contains(OLD_EST_SUFFIX));
|
||||||
|
}
|
||||||
|
|
||||||
public static class TestFragment extends PowerUsageSummary {
|
public static class TestFragment extends PowerUsageSummary {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
Reference in New Issue
Block a user