diff options
7 files changed, 182 insertions, 18 deletions
diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index 0eaf08e..0533b6f 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -25,7 +25,8 @@ <FrameLayout android:id="@+id/bar_contents_holder" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="@*android:dimen/status_bar_height" + android:layout_gravity="bottom" > <RelativeLayout android:id="@+id/bar_contents" @@ -93,7 +94,8 @@ <FrameLayout android:id="@+id/bar_shadow_holder" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="@*android:dimen/status_bar_height" + android:layout_gravity="bottom" > <!-- lights out shade --> <RelativeLayout diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java index 472a225..8fca759 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java @@ -52,6 +52,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac // Up-call methods protected abstract View makeStatusBarView(); protected abstract int getStatusBarGravity(); + public abstract int getStatusBarHeight(); private DoNotDisturb mDoNotDisturb; @@ -104,8 +105,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac } // Put up the view - final Resources res = mContext.getResources(); - final int height= res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); + final int height = getStatusBarHeight(); final WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 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 0d6c5f6..132433b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -287,9 +287,13 @@ public class PhoneStatusBar extends StatusBar { return Gravity.TOP | Gravity.FILL_HORIZONTAL; } - private void addIntruderView() { + public int getStatusBarHeight() { final Resources res = mContext.getResources(); - final int height= res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); + return res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); + } + + private void addIntruderView() { + final int height = getStatusBarHeight(); WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HeightReceiver.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HeightReceiver.java new file mode 100644 index 0000000..5616159 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/HeightReceiver.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2011 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.systemui.statusbar.tablet; + +import java.util.ArrayList; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.Slog; +import android.view.View; +import android.view.WindowManager; +import android.view.WindowManagerImpl; +import android.view.WindowManagerPolicy; + +public class HeightReceiver extends BroadcastReceiver { + private static final String TAG = "StatusBar.HeightReceiver"; + + public interface OnBarHeightChangedListener { + public void onBarHeightChanged(int height); + } + + Context mContext; + ArrayList<OnBarHeightChangedListener> mListeners = new ArrayList<OnBarHeightChangedListener>(); + WindowManager mWindowManager; + int mHeight; + + public HeightReceiver(Context context) { + mContext = context; + mWindowManager = WindowManagerImpl.getDefault(); + } + + public void addOnBarHeightChangedListener(OnBarHeightChangedListener l) { + mListeners.add(l); + l.onBarHeightChanged(mHeight); + } + + public void removeOnBarHeightChangedListener(OnBarHeightChangedListener l) { + mListeners.remove(l); + } + + @Override + public void onReceive(Context context, Intent intent) { + final boolean plugged + = intent.getBooleanExtra(WindowManagerPolicy.EXTRA_HDMI_PLUGGED_STATE, false); + setPlugged(plugged); + } + + public void registerReceiver() { + final IntentFilter filter = new IntentFilter(); + filter.addAction(WindowManagerPolicy.ACTION_HDMI_PLUGGED); + final Intent val = mContext.registerReceiver(this, filter); + onReceive(mContext, val); + } + + private void setPlugged(boolean plugged) { + final Resources res = mContext.getResources(); + + Slog.d(TAG, "plugged=" + plugged); + int height = -1; + if (plugged) { + final DisplayMetrics metrics = new DisplayMetrics(); + mWindowManager.getDefaultDisplay().getMetrics(metrics); + Slog.d(TAG, "metrics=" + metrics); + height = metrics.heightPixels - 720; + } + + final int minHeight + = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); + if (height < minHeight) { + height = minHeight; + } + Slog.d(TAG, "using height=" + height + " old=" + mHeight); + mHeight = height; + + final int N = mListeners.size(); + for (int i=0; i<N; i++) { + mListeners.get(i).onBarHeightChanged(height); + } + } + + public int getHeight() { + return mHeight; + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java index 3201d06..ffbc0e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -58,7 +58,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, ViewGroup mContentParent; Choreographer mChoreo = new Choreographer(); - int mStatusBarHeight; public NotificationPanel(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -66,11 +65,6 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public NotificationPanel(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - - final Resources res = context.getResources(); - - mStatusBarHeight = res.getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index cd39d71..f858f61 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -74,7 +74,8 @@ import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.recent.RecentApplicationsActivity; -public class TabletStatusBar extends StatusBar { +public class TabletStatusBar extends StatusBar implements + HeightReceiver.OnBarHeightChangedListener { public static final boolean DEBUG = false; public static final String TAG = "TabletStatusBar"; @@ -97,7 +98,9 @@ public class TabletStatusBar extends StatusBar { public static final int LIGHTS_ON_DELAY = 5000; - int mBarHeight = -1; + // The height of the bar, as definied by the build. It may be taller if we're plugged + // into hdmi. + int mNaturalBarHeight = -1; int mIconSize = -1; int mIconHPadding = -1; @@ -134,6 +137,7 @@ public class TabletStatusBar extends StatusBar { ViewGroup mPile; + HeightReceiver mHeightReceiver; BatteryController mBatteryController; NetworkController mNetworkController; @@ -269,15 +273,15 @@ public class TabletStatusBar extends StatusBar { } @Override - protected void onConfigurationChanged (Configuration newConfig) { + protected void onConfigurationChanged(Configuration newConfig) { loadDimens(); } protected void loadDimens() { final Resources res = mContext.getResources(); - mBarHeight = res.getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height); + mNaturalBarHeight = res.getDimensionPixelSize( + com.android.internal.R.dimen.status_bar_height); int newIconSize = res.getDimensionPixelSize( com.android.internal.R.dimen.status_bar_icon_size); @@ -298,6 +302,10 @@ public class TabletStatusBar extends StatusBar { mWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); + // This guy will listen for HDMI plugged broadcasts so we can resize the + // status bar as appropriate. + mHeightReceiver = new HeightReceiver(mContext); + mHeightReceiver.registerReceiver(); loadDimens(); final TabletStatusBarView sb = (TabletStatusBarView)View.inflate( @@ -408,13 +416,33 @@ public class TabletStatusBar extends StatusBar { ScrollView scroller = (ScrollView)mPile.getParent(); scroller.setFillViewport(true); + mHeightReceiver.addOnBarHeightChangedListener(this); + return sb; } + public int getStatusBarHeight() { + return mHeightReceiver.getHeight(); + } + protected int getStatusBarGravity() { return Gravity.BOTTOM | Gravity.FILL_HORIZONTAL; } + public void onBarHeightChanged(int height) { + final WindowManager.LayoutParams lp + = (WindowManager.LayoutParams)mStatusBarView.getLayoutParams(); + if (lp == null) { + // haven't been added yet + return; + } + if (lp.height != height) { + lp.height = height; + final WindowManager wm = WindowManagerImpl.getDefault(); + wm.updateViewLayout(mStatusBarView, lp); + } + } + private class H extends Handler { public void handleMessage(Message m) { switch (m.what) { @@ -1048,7 +1076,7 @@ public class TabletStatusBar extends StatusBar { if (mIconLayout == null) return; final LinearLayout.LayoutParams params - = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mBarHeight); + = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight); int N = mNotns.size(); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 3e8318e..243fa07 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -122,6 +122,8 @@ import android.media.IAudioService; import android.media.AudioManager; import java.io.File; +import java.io.FileReader; +import java.io.IOException; import java.util.ArrayList; /** @@ -712,6 +714,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (new File("/sys/devices/virtual/switch/hdmi/state").exists()) { mHDMIObserver.startObserving("DEVPATH=/devices/virtual/switch/hdmi"); } + mHdmiPlugged = !readHdmiState(); + setHdmiPlugged(!mHdmiPlugged); // Note: the Configuration is not stable here, so we cannot load mStatusBarCanHide from // config_statusBarCanHide because the latter depends on the screen size @@ -2000,11 +2004,40 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHdmiPlugged = plugged; updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); Intent intent = new Intent(ACTION_HDMI_PLUGGED); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); intent.putExtra(EXTRA_HDMI_PLUGGED_STATE, plugged); mContext.sendStickyBroadcast(intent); } } + boolean readHdmiState() { + final String filename = "/sys/class/switch/hdmi/state"; + FileReader reader = null; + try { + reader = new FileReader(filename); + char[] buf = new char[15]; + int n = reader.read(buf); + if (n > 1) { + return 0 != Integer.parseInt(new String(buf, 0, n-1)); + } else { + return false; + } + } catch (IOException ex) { + Slog.d(TAG, "couldn't read hdmi state from " + filename + ": " + ex); + return false; + } catch (NumberFormatException ex) { + Slog.d(TAG, "couldn't read hdmi state from " + filename + ": " + ex); + return false; + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException ex) { + } + } + } + } + /** * @return Whether music is being played right now. */ |