diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
index 693d8c3459133..d24d21ecb12f1 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
@@ -35,12 +35,65 @@
android:background="@drawable/notification_header_bg"
android:clickable="true"
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
search
+
+ Charged
+
+
+ Charging
+
+
+ %s until full
+
+
+ Not charging
+
!
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index b0b018dae3392..43560a3908fe1 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -70,17 +70,29 @@
+
+
+
+
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 4749b9ce3a973..f86572de2d0ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -266,7 +266,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private TextView mCarrierLabel;
private boolean mCarrierLabelVisible = false;
private int mCarrierLabelHeight;
- private TextView mEmergencyCallLabel;
private int mStatusBarHeaderHeight;
private boolean mShowCarrierInPanel = false;
@@ -720,23 +719,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mNetworkController.addSignalCluster(signalCluster);
signalCluster.setNetworkController(mNetworkController);
-
final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
if (isAPhone) {
- mEmergencyCallLabel =
- (TextView) mStatusBarWindow.findViewById(R.id.emergency_calls_only);
- // TODO: Uncomment when correctly positioned
-// if (mEmergencyCallLabel != null) {
-// mNetworkController.addEmergencyLabelView(mEmergencyCallLabel);
-// mEmergencyCallLabel.setOnClickListener(new View.OnClickListener() {
-// public void onClick(View v) { }});
-// mEmergencyCallLabel.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
-// @Override
-// public void onLayoutChange(View v, int left, int top, int right, int bottom,
-// int oldLeft, int oldTop, int oldRight, int oldBottom) {
-// updateCarrierLabelVisibility(false);
-// }});
-// }
+ mNetworkController.addEmergencyLabelView(mHeader);
}
mCarrierLabel = (TextView)mStatusBarWindow.findViewById(R.id.carrier_label);
@@ -762,6 +747,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// updateCarrierLabelVisibility(false);
}
+ mBatteryController.setStatusBarHeaderView(mHeader);
+
// Set up the quick settings tile panel
mQSPanel = (QSPanel) mStatusBarWindow.findViewById(R.id.quick_settings_panel);
if (mQSPanel != null) {
@@ -1351,7 +1338,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mCarrierLabelHeight));
}
- final boolean emergencyCallsShownElsewhere = mEmergencyCallLabel != null;
+ // Emergency calls only is shown in the expanded header now.
+ final boolean emergencyCallsShownElsewhere = true;
final boolean makeVisible =
!(emergencyCallsShownElsewhere && mNetworkController.isEmergencyOnly())
&& mStackScroller.getHeight() < (mNotificationPanel.getHeight()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index 13d3291e43e50..1916f1347beaa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -26,6 +26,7 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
+import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.qs.QSPanel;
@@ -57,6 +58,11 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
private View mSignalCluster;
private View mSettingsButton;
private View mBrightnessContainer;
+ private View mEmergencyCallsOnly;
+ private TextView mChargingInfo;
+
+ private boolean mShowEmergencyCallsOnly;
+ private boolean mShowChargingInfo;
private int mCollapsedHeight;
private int mExpandedHeight;
@@ -91,6 +97,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
mBrightnessController = new BrightnessController(getContext(),
(ImageView) findViewById(R.id.brightness_icon),
(ToggleSlider) findViewById(R.id.brightness_slider));
+ mEmergencyCallsOnly = findViewById(R.id.header_emergency_calls_only);
+ mChargingInfo = (TextView) findViewById(R.id.header_charging_info);
loadDimens();
updateVisibilities();
addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@@ -195,13 +203,32 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
if (mSignalCluster != null) {
mSignalCluster.setVisibility(!mExpanded || mOverscrolled ? View.VISIBLE : View.GONE);
}
+ mEmergencyCallsOnly.setVisibility(mExpanded && !mOverscrolled && mShowEmergencyCallsOnly
+ ? VISIBLE : GONE);
+ mChargingInfo.setVisibility(mExpanded && !mOverscrolled && mShowChargingInfo
+ && !mShowEmergencyCallsOnly ? VISIBLE : GONE);
}
private void updateSystemIconsLayoutParams() {
RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsContainer.getLayoutParams();
- lp.addRule(RelativeLayout.START_OF, mExpanded
- ? mSettingsButton.getId()
- : mMultiUserSwitch.getId());
+ boolean systemIconsAboveClock = mExpanded && !mOverscrolled
+ && mShowChargingInfo && !mShowEmergencyCallsOnly;
+ if (systemIconsAboveClock) {
+ lp.addRule(ALIGN_PARENT_START);
+ lp.removeRule(START_OF);
+ } else {
+ lp.addRule(RelativeLayout.START_OF, mExpanded
+ ? mSettingsButton.getId()
+ : mMultiUserSwitch.getId());
+ lp.removeRule(ALIGN_PARENT_START);
+ }
+
+ RelativeLayout.LayoutParams clockLp = (LayoutParams) mDateTime.getLayoutParams();
+ if (systemIconsAboveClock) {
+ clockLp.addRule(BELOW, mChargingInfo.getId());
+ } else {
+ clockLp.addRule(BELOW, mEmergencyCallsOnly.getId());
+ }
}
private void updateBrightnessControllerState() {
@@ -307,4 +334,24 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
mBrightnessContainer.animate().alpha(showingDetail ? 0 : 1).withLayer().start();
}
};
+
+ public void setShowEmergencyCallsOnly(boolean show) {
+ mShowEmergencyCallsOnly = show;
+ if (mExpanded) {
+ updateVisibilities();
+ updateSystemIconsLayoutParams();
+ }
+ }
+
+ public void setShowChargingInfo(boolean showChargingInfo) {
+ mShowChargingInfo = showChargingInfo;
+ if (mExpanded) {
+ updateVisibilities();
+ updateSystemIconsLayoutParams();
+ }
+ }
+
+ public void setChargingInfo(CharSequence chargingInfo) {
+ mChargingInfo.setText(chargingInfo);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index 6db9bc38b1731..4cf66a3e00dce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -16,26 +16,49 @@
package com.android.systemui.statusbar.policy;
+import com.android.internal.app.IBatteryStats;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.StatusBarHeaderView;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
+import android.os.BatteryStats;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.text.format.Formatter;
+import android.util.Log;
import java.util.ArrayList;
public class BatteryController extends BroadcastReceiver {
private static final String TAG = "StatusBar.BatteryController";
-
private ArrayList mChangeCallbacks =
new ArrayList();
+ private Context mContext;
+ private StatusBarHeaderView mStatusBarHeaderView;
+ private IBatteryStats mBatteryInfo;
+
+ private int mLevel;
+ private boolean mPluggedIn;
+ private boolean mCharging;
+ private boolean mCharged;
+
+
public interface BatteryStateChangeCallback {
- public void onBatteryLevelChanged(int level, boolean pluggedIn);
+ public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging);
}
public BatteryController(Context context) {
+ mContext = context;
+
+ mBatteryInfo = IBatteryStats.Stub.asInterface(
+ ServiceManager.getService(BatteryStats.SERVICE_NAME));
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
context.registerReceiver(this, filter);
@@ -45,24 +68,59 @@ public class BatteryController extends BroadcastReceiver {
mChangeCallbacks.add(cb);
}
+ public void setStatusBarHeaderView(StatusBarHeaderView statusBarHeaderView) {
+ mStatusBarHeaderView = statusBarHeaderView;
+ updateStatusBarHeaderView();
+ }
+
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
- final int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+ mLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+ mPluggedIn = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
+
final int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
+ mCharged = status == BatteryManager.BATTERY_STATUS_FULL;
+ mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING;
- boolean plugged = false;
- switch (status) {
- case BatteryManager.BATTERY_STATUS_CHARGING:
- case BatteryManager.BATTERY_STATUS_FULL:
- plugged = true;
- break;
- }
-
+ updateStatusBarHeaderView();
for (BatteryStateChangeCallback cb : mChangeCallbacks) {
- cb.onBatteryLevelChanged(level, plugged);
+ cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging);
}
}
}
+
+ private void updateStatusBarHeaderView() {
+ if (mStatusBarHeaderView != null) {
+ mStatusBarHeaderView.setShowChargingInfo(mPluggedIn);
+ mStatusBarHeaderView.setChargingInfo(computeChargingInfo());
+ }
+ }
+
+ private String computeChargingInfo() {
+ if (!mPluggedIn || !mCharged && !mCharging) {
+ return mContext.getResources().getString(R.string.expanded_header_battery_not_charging);
+ }
+
+ if (mCharged) {
+ return mContext.getResources().getString(R.string.expanded_header_battery_charged);
+ }
+
+ // Try fetching charging time from battery stats.
+ try {
+ long chargingTimeRemaining = mBatteryInfo.computeChargeTimeRemaining();
+ if (chargingTimeRemaining > 0) {
+ String chargingTimeFormatted =
+ Formatter.formatShortElapsedTime(mContext, chargingTimeRemaining);
+ return mContext.getResources().getString(
+ R.string.expanded_header_battery_charging_with_time, chargingTimeFormatted);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling IBatteryStats: ", e);
+ }
+
+ // Fall back to simple charging label.
+ return mContext.getResources().getString(R.string.expanded_header_battery_charging);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 56402a5d9b8e0..bf908fec48dec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -47,6 +47,7 @@ import com.android.internal.telephony.cdma.EriInfo;
import com.android.internal.util.AsyncChannel;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.StatusBarHeaderView;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -143,7 +144,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
ArrayList mCombinedLabelViews = new ArrayList();
ArrayList mMobileLabelViews = new ArrayList();
ArrayList mWifiLabelViews = new ArrayList();
- ArrayList mEmergencyLabelViews = new ArrayList();
+ ArrayList mEmergencyViews = new ArrayList<>();
ArrayList mSignalClusters = new ArrayList();
ArrayList mSignalsChangedCallbacks =
new ArrayList();
@@ -261,8 +262,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
mWifiLabelViews.add(v);
}
- public void addEmergencyLabelView(TextView v) {
- mEmergencyLabelViews.add(v);
+ public void addEmergencyLabelView(StatusBarHeaderView v) {
+ mEmergencyViews.add(v);
}
public void addSignalCluster(SignalCluster cluster) {
@@ -1251,15 +1252,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
}
// e-call label
- N = mEmergencyLabelViews.size();
+ N = mEmergencyViews.size();
for (int i=0; i