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