diff options
author | Daniel Sandler <dsandler@android.com> | 2011-05-04 11:26:38 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-05-04 11:26:38 -0700 |
commit | 0c19aaaebb5baf78857e2e18ebe7fb37b7e1cf8e (patch) | |
tree | 23a20876a43b62c67c94d7e7b579201a0671f894 /packages | |
parent | 65b96059766a12454236712931d66bffb311729c (diff) | |
parent | 8956dbbc5f292d8b79072ae73b25f2114c8c7479 (diff) | |
download | frameworks_base-0c19aaaebb5baf78857e2e18ebe7fb37b7e1cf8e.zip frameworks_base-0c19aaaebb5baf78857e2e18ebe7fb37b7e1cf8e.tar.gz frameworks_base-0c19aaaebb5baf78857e2e18ebe7fb37b7e1cf8e.tar.bz2 |
Merge "On-screen navigation bar (separate from the status bar)."
Diffstat (limited to 'packages')
5 files changed, 269 insertions, 1 deletions
diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml new file mode 100644 index 0000000..eba4480 --- /dev/null +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* apps/common/assets/default/default/skins/StatusBar.xml +** +** Copyright 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. +*/ +--> + +<com.android.systemui.statusbar.phone.NavigationBarView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" + android:layout_height="match_parent" + android:layout_width="match_parent" + > + + <LinearLayout android:id="@+id/rot0" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:paddingLeft="8dip" + android:paddingRight="8dip" + android:background="#FF000000" + android:orientation="horizontal" + > + + <!-- navigation controls --> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/ic_sysbar_back" + systemui:keyCode="4" + android:layout_weight="1" + /> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/ic_sysbar_home" + systemui:keyCode="3" + android:layout_weight="1" + /> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/ic_sysbar_menu" + systemui:keyCode="82" + android:layout_weight="1" + /> + </LinearLayout> + + <LinearLayout android:id="@+id/rot90" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:background="#FF000000" + android:orientation="vertical" + android:visibility="gone" + > + + <!-- navigation controls --> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:src="@drawable/ic_sysbar_menu" + systemui:keyCode="82" + android:layout_weight="1" + /> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:src="@drawable/ic_sysbar_home" + systemui:keyCode="3" + android:layout_weight="1" + /> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:src="@drawable/ic_sysbar_back" + systemui:keyCode="4" + android:layout_weight="1" + /> + </LinearLayout> + + <LinearLayout android:id="@+id/rot270" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:background="#FF000000" + android:orientation="vertical" + android:visibility="gone" + > + + <!-- navigation controls --> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:src="@drawable/ic_sysbar_back" + systemui:keyCode="4" + android:layout_weight="1" + /> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:src="@drawable/ic_sysbar_home" + systemui:keyCode="3" + android:layout_weight="1" + /> + <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:src="@drawable/ic_sysbar_menu" + systemui:keyCode="82" + android:layout_weight="1" + /> + </LinearLayout> +</com.android.systemui.statusbar.phone.NavigationBarView> diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml new file mode 100644 index 0000000..bcc8da1 --- /dev/null +++ b/packages/SystemUI/res/values-land/dimens.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * 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. +*/ +--> +<resources> + <!-- thickness (width) of the navigation bar on phones that require it --> + <dimen name="navigation_bar_size">42dp</dimen> +</resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 88cd43c..a2577cb 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -31,5 +31,7 @@ <!-- Width of scrollable area in recents --> <dimen name="status_bar_recents_width">356dp</dimen> + <!-- thickness (height) of the navigation bar on phones that require it --> + <dimen name="navigation_bar_size">42dp</dimen> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java new file mode 100644 index 0000000..ec169e5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008 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.phone; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Display; +import android.view.KeyEvent; +import android.view.View; +import android.view.Surface; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.content.res.Configuration; + +import com.android.systemui.R; + +public class NavigationBarView extends LinearLayout { + final Display mDisplay; + View[] mRotatedViews = new View[4]; + + public NavigationBarView(Context context, AttributeSet attrs) { + super(context, attrs); + mDisplay = ((WindowManager)context.getSystemService( + Context.WINDOW_SERVICE)).getDefaultDisplay(); + } + + public void onFinishInflate() { + mRotatedViews[Surface.ROTATION_0] = + mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0); + + mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90); + + mRotatedViews[Surface.ROTATION_270] = findViewById(R.id.rot270); + } + + public void reorient() { + final int rot = mDisplay.getRotation(); + for (int i=0; i<4; i++) { + mRotatedViews[i].setVisibility(View.GONE); + } + mRotatedViews[rot].setVisibility(View.VISIBLE); + + android.util.Log.d("NavigationBarView", "reorient(): rot=" + mDisplay.getRotation()); + } +} 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 5755f32..b4adde6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -45,6 +45,7 @@ import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; +import android.view.Surface; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; @@ -141,6 +142,9 @@ public class PhoneStatusBar extends StatusBar { // for immersive activities private View mIntruderAlertView; + // on-screen navigation buttons + private NavigationBarView mNavigationBarView; + // the tracker view TrackingView mTrackingView; WindowManager.LayoutParams mTrackingParams; @@ -199,7 +203,9 @@ public class PhoneStatusBar extends StatusBar { super.start(); - addIntruderView(); + addNavigationBar(); + + //addIntruderView(); // Lastly, call to the icon policy to install/update all the icons. mIconPolicy = new PhoneStatusBarPolicy(mContext); @@ -223,6 +229,9 @@ public class PhoneStatusBar extends StatusBar { mIntruderAlertView.setVisibility(View.GONE); mIntruderAlertView.setClickable(true); + mNavigationBarView = + (NavigationBarView) View.inflate(context, R.layout.navigation_bar, null); + PhoneStatusBarView sb = (PhoneStatusBarView)View.inflate(context, R.layout.status_bar, null); sb.mService = this; @@ -292,6 +301,58 @@ public class PhoneStatusBar extends StatusBar { return res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); } + // For small-screen devices (read: phones) that lack hardware navigation buttons + private void addNavigationBar() { + mNavigationBarView.reorient(); + WindowManagerImpl.getDefault().addView( + mNavigationBarView, getNavigationBarLayoutParams()); + } + + private void repositionNavigationBar() { + mNavigationBarView.reorient(); + WindowManagerImpl.getDefault().updateViewLayout( + mNavigationBarView, getNavigationBarLayoutParams()); + } + + private WindowManager.LayoutParams getNavigationBarLayoutParams() { + final int rotation = mDisplay.getRotation(); + final boolean sideways = + (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270); + + final Resources res = mContext.getResources(); + final int size = res.getDimensionPixelSize(R.dimen.navigation_bar_size); + + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + sideways ? size : ViewGroup.LayoutParams.MATCH_PARENT, + sideways ? ViewGroup.LayoutParams.MATCH_PARENT : size, + WindowManager.LayoutParams.TYPE_NAVIGATION_BAR, + 0 + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, + PixelFormat.TRANSLUCENT); + + lp.setTitle("NavigationBar"); + switch (rotation) { + case Surface.ROTATION_90: + // device has been turned 90deg counter-clockwise + lp.gravity = Gravity.RIGHT | Gravity.FILL_VERTICAL; + break; + case Surface.ROTATION_270: + // device has been turned 90deg clockwise + lp.gravity = Gravity.LEFT | Gravity.FILL_VERTICAL; + break; + default: + lp.gravity = Gravity.BOTTOM | Gravity.FILL_HORIZONTAL; + break; + } + lp.windowAnimations = 0; + + return lp; + } + private void addIntruderView() { final int height = getStatusBarHeight(); @@ -1529,6 +1590,7 @@ public class PhoneStatusBar extends StatusBar { animateCollapse(); } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { + repositionNavigationBar(); updateResources(); } } |