diff options
25 files changed, 280 insertions, 85 deletions
| diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 4fe9cef2b7c2..a8ed13255320 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1442,9 +1442,10 @@ public class ActivityManager {      public int getLauncherLargeIconDensity() {          final Resources res = mContext.getResources();          final int density = res.getDisplayMetrics().densityDpi; +        final int sw = res.getConfiguration().smallestScreenWidthDp; -        if ((res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) -                != Configuration.SCREENLAYOUT_SIZE_XLARGE) { +        if (sw < 600) { +            // Smaller than approx 7" tablets, use the regular icon size.              return density;          } @@ -1458,7 +1459,9 @@ public class ActivityManager {              case DisplayMetrics.DENSITY_XHIGH:                  return DisplayMetrics.DENSITY_MEDIUM * 2;              default: -                return density; +                // The density is some abnormal value.  Return some other +                // abnormal value that is a reasonable scaling of it. +                return (int)(density*1.5f);          }      } @@ -1471,9 +1474,10 @@ public class ActivityManager {      public int getLauncherLargeIconSize() {          final Resources res = mContext.getResources();          final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size); +        final int sw = res.getConfiguration().smallestScreenWidthDp; -        if ((res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) -                != Configuration.SCREENLAYOUT_SIZE_XLARGE) { +        if (sw < 600) { +            // Smaller than approx 7" tablets, use the regular icon size.              return size;          } @@ -1489,7 +1493,9 @@ public class ActivityManager {              case DisplayMetrics.DENSITY_XHIGH:                  return (size * DisplayMetrics.DENSITY_MEDIUM * 2) / DisplayMetrics.DENSITY_XHIGH;              default: -                return size; +                // The density is some abnormal value.  Return some other +                // abnormal value that is a reasonable scaling of it. +                return (int)(size*1.5f);          }      } diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 5b8addf2a7c2..dd9f3376d74e 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -56,6 +56,11 @@ public class StatusBarManager {              | DISABLE_NOTIFICATION_ALERTS | DISABLE_NOTIFICATION_TICKER              | DISABLE_SYSTEM_INFO | DISABLE_RECENT | DISABLE_HOME | DISABLE_BACK | DISABLE_CLOCK; +    public static final int NAVIGATION_HINT_BACK_NOP      = 1 << 0; +    public static final int NAVIGATION_HINT_HOME_NOP      = 1 << 1; +    public static final int NAVIGATION_HINT_RECENT_NOP    = 1 << 2; +    public static final int NAVIGATION_HINT_BACK_ALT      = 1 << 3; +      private Context mContext;      private IStatusBarService mService;      private IBinder mToken = new Binder(); diff --git a/data/fonts/DroidSansFallback.ttf b/data/fonts/DroidSansFallback.ttfBinary files differ index ff976700702c..cfbc66ad0470 100644 --- a/data/fonts/DroidSansFallback.ttf +++ b/data/fonts/DroidSansFallback.ttf diff --git a/data/fonts/DroidSansFallbackFull.ttf b/data/fonts/DroidSansFallbackFull.ttfBinary files differ index 03ceae5df855..0cacabedcaed 100644 --- a/data/fonts/DroidSansFallbackFull.ttf +++ b/data/fonts/DroidSansFallbackFull.ttf diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime.pngBinary files differ index 3071fb368f7c..3071fb368f7c 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_default.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_pressed.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_pressed.pngBinary files differ deleted file mode 100644 index 475712560a74..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_pressed.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime.pngBinary files differ index 72b5ffef9f95..72b5ffef9f95 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.pngBinary files differ deleted file mode 100644 index 0cd05a30b737..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_pressed.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime.pngBinary files differ index 7f05602265a4..7f05602265a4 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_default.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_pressed.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_pressed.pngBinary files differ deleted file mode 100644 index 3e59c8dd0eab..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_pressed.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml b/packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml deleted file mode 100644 index 248496d046e8..000000000000 --- a/packages/SystemUI/res/drawable/ic_sysbar_back_ime.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> -    <item android:state_pressed="true" android:drawable="@drawable/ic_sysbar_back_ime_pressed" /> -    <item android:drawable="@drawable/ic_sysbar_back_ime_default" /> -</selector> - diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar.xml b/packages/SystemUI/res/layout-sw600dp/status_bar.xml index b96c35701b6a..2308bf0c4a1f 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar.xml @@ -54,7 +54,7 @@                  android:clipToPadding="false"                  >                  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" -                    android:layout_width="80dip" +                    android:layout_width="@dimen/navigation_key_width"                      android:layout_height="match_parent"                      android:src="@drawable/ic_sysbar_back"                      systemui:keyCode="4" @@ -62,7 +62,7 @@                      systemui:glowBackground="@drawable/ic_sysbar_highlight"                      />                  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" -                    android:layout_width="80dip" +                    android:layout_width="@dimen/navigation_key_width"                      android:layout_height="match_parent"                      android:src="@drawable/ic_sysbar_home"                      systemui:keyCode="3" @@ -70,14 +70,14 @@                      systemui:glowBackground="@drawable/ic_sysbar_highlight"                      />                  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps" -                    android:layout_width="80dip" +                    android:layout_width="@dimen/navigation_key_width"                      android:layout_height="match_parent"                      android:src="@drawable/ic_sysbar_recent"                      android:contentDescription="@string/accessibility_recent"                      systemui:glowBackground="@drawable/ic_sysbar_highlight"                      />                  <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" -                    android:layout_width="80dip" +                    android:layout_width="@dimen/navigation_menu_key_width"                      android:layout_height="match_parent"                      android:src="@drawable/ic_sysbar_menu"                      systemui:keyCode="82" diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml index 111f9a42de1c..8e231d0a845c 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_panel.xml @@ -32,7 +32,7 @@          android:layout_width="wrap_content"          android:layout_height="match_parent"          android:layout_alignParentBottom="true" -        android:paddingBottom="@*android:dimen/status_bar_height" +        android:layout_marginBottom="@*android:dimen/status_bar_height"          android:clipToPadding="false"          android:clipChildren="false"> @@ -69,13 +69,12 @@      </FrameLayout> -    <View android:id="@+id/recents_dismiss_button" -        android:layout_width="80px" +    <com.android.systemui.recent.StatusBarTouchProxy +        android:id="@+id/status_bar_touch_proxy" +        android:layout_width="match_parent"          android:layout_height="@*android:dimen/status_bar_height"          android:layout_alignParentBottom="true"          android:layout_alignParentLeft="true" -        android:background="@drawable/ic_sysbar_back_ime" -        android:contentDescription="@string/status_bar_accessibility_dismiss_recents"      /> diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index d19fd81f8e62..ef2996e74a94 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -49,7 +49,7 @@                  android:visibility="invisible"                  />              <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" -                android:layout_width="80dp" +                android:layout_width="@dimen/navigation_key_width"                  android:layout_height="match_parent"                  android:src="@drawable/ic_sysbar_back"                  systemui:keyCode="4" @@ -64,7 +64,7 @@                  android:visibility="invisible"                  />              <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home" -                android:layout_width="80dp" +                android:layout_width="@dimen/navigation_key_width"                  android:layout_height="match_parent"                  android:src="@drawable/ic_sysbar_home"                  systemui:keyCode="3" @@ -80,7 +80,7 @@                  android:visibility="invisible"                  />              <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps" -                android:layout_width="80dp" +                android:layout_width="@dimen/navigation_key_width"                  android:layout_height="match_parent"                  android:src="@drawable/ic_sysbar_recent"                  android:layout_weight="0" @@ -88,7 +88,7 @@                  android:contentDescription="@string/accessibility_recent"                  />              <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu" -                android:layout_width="40dp" +                android:layout_width="@dimen/navigation_menu_key_width"                  android:layout_height="match_parent"                  android:src="@drawable/ic_sysbar_menu"                  systemui:keyCode="82" diff --git a/packages/SystemUI/res/values-sw600dp-port/dimens.xml b/packages/SystemUI/res/values-sw600dp-port/dimens.xml index b8a6cfe49400..39eade6104a6 100644 --- a/packages/SystemUI/res/values-sw600dp-port/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-port/dimens.xml @@ -18,5 +18,11 @@  <resources>      <!-- gap on either side of status bar notification icons -->      <dimen name="status_bar_icon_padding">0dp</dimen> + +    <!-- The width of the view containing non-menu status bar icons --> +    <dimen name="navigation_key_width">70dip</dimen> + +    <!-- The width of the view containing the menu status bar icon --> +    <dimen name="navigation_menu_key_width">40dip</dimen>  </resources> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index f522285a18a6..ba1cdfac335e 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -67,4 +67,10 @@      <!-- opacity at which Notification icons will be drawn in the status bar -->      <item type="dimen" name="status_bar_icon_drawing_alpha">100%</item> + +    <!-- The width of the view containing non-menu status bar icons --> +    <dimen name="navigation_key_width">80dip</dimen> + +    <!-- The width of the view containing the menu status bar icon --> +    <dimen name="navigation_menu_key_width">40dip</dimen>  </resources> diff --git a/packages/SystemUI/res/values-sw720dp/dimens.xml b/packages/SystemUI/res/values-sw720dp/dimens.xml index 6736c1ad2673..b16b1e80cb57 100644 --- a/packages/SystemUI/res/values-sw720dp/dimens.xml +++ b/packages/SystemUI/res/values-sw720dp/dimens.xml @@ -21,5 +21,11 @@      <!-- opacity at which Notification icons will be drawn in the status bar -->      <item type="dimen" name="status_bar_icon_drawing_alpha">100%</item> + +    <!-- The width of the view containing non-menu status bar icons --> +    <dimen name="navigation_key_width">80dip</dimen> + +    <!-- The width of the view containing the menu status bar icon --> +    <dimen name="navigation_menu_key_width">80dip</dimen>  </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 8fba86a5b2e5..2c22e3cec573 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -91,4 +91,9 @@      <!-- The padding on the global screenshot background image -->      <dimen name="global_screenshot_bg_padding">20dp</dimen> +    <!-- The width of the view containing non-menu status bar icons --> +    <dimen name="navigation_key_width">80dip</dimen> + +    <!-- The width of the view containing the menu status bar icon --> +    <dimen name="navigation_menu_key_width">40dip</dimen>  </resources> diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java index 8bfd7111fb5a..4aec22c9bbc7 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java @@ -68,10 +68,11 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe      private View mRecentsScrim;      private View mRecentsNoApps;      private ViewGroup mRecentsContainer; +    private StatusBarTouchProxy mStatusBarTouchProxy;      private boolean mShowing;      private Choreographer mChoreo; -    private View mRecentsDismissButton; +    OnRecentsPanelVisibilityChangedListener mVisibilityChangedListener;      private RecentTasksLoader mRecentTasksLoader;      private ArrayList<TaskDescription> mRecentTaskDescriptions; @@ -81,8 +82,8 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe      private int mThumbnailWidth;      private boolean mFitThumbnailToXY; -    public void setRecentTasksLoader(RecentTasksLoader loader) { -        mRecentTasksLoader = loader; +    public static interface OnRecentsPanelVisibilityChangedListener { +        public void onRecentsPanelVisibilityChanged(boolean visible);      }      private final class OnLongClickDelegate implements View.OnLongClickListener { @@ -171,15 +172,18 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe          return super.onKeyUp(keyCode, event);      } -    public boolean isInContentArea(int x, int y) { -        // use mRecentsContainer's exact bounds to determine horizontal position -        final int l = mRecentsContainer.getLeft(); -        final int r = mRecentsContainer.getRight(); -        final int t = mRecentsContainer.getTop(); -        final int b = mRecentsContainer.getBottom(); +    private boolean pointInside(int x, int y, View v) { +        final int l = v.getLeft(); +        final int r = v.getRight(); +        final int t = v.getTop(); +        final int b = v.getBottom();          return x >= l && x < r && y >= t && y < b;      } +    public boolean isInContentArea(int x, int y) { +        return pointInside(x, y, mRecentsContainer) || pointInside(x, y, mStatusBarTouchProxy); +    } +      public void show(boolean show, boolean animate) {          show(show, animate, null);      } @@ -278,7 +282,6 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe      public void onAnimationStart(Animator animation) {      } -      /**       * We need to be aligned at the bottom.  LinearLayout can't do this, so instead,       * let LinearLayout do all the hard work, and then shift everything down to the bottom. @@ -312,6 +315,29 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe      public void setBar(StatusBar bar) {          mBar = bar; + +    } + +    public void setStatusBarView(View statusBarView) { +        if (mStatusBarTouchProxy != null) { +            mStatusBarTouchProxy.setStatusBar(statusBarView); +        } +    } + +    public void setRecentTasksLoader(RecentTasksLoader loader) { +        mRecentTasksLoader = loader; +    } + +    public void setOnVisibilityChangedListener(OnRecentsPanelVisibilityChangedListener l) { +        mVisibilityChangedListener = l; + +    } + +    public void setVisibility(int visibility) { +        if (mVisibilityChangedListener != null) { +            mVisibilityChangedListener.onRecentsPanelVisibilityChanged(visibility == VISIBLE); +        } +        super.setVisibility(visibility);      }      public RecentsPanelView(Context context, AttributeSet attrs) { @@ -335,6 +361,7 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe          super.onFinishInflate();          mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          mRecentsContainer = (ViewGroup) findViewById(R.id.recents_container); +        mStatusBarTouchProxy = (StatusBarTouchProxy) findViewById(R.id.status_bar_touch_proxy);          mListAdapter = new TaskDescriptionAdapter(mContext);          if (mRecentsContainer instanceof RecentsHorizontalScrollView){              RecentsHorizontalScrollView scrollView @@ -355,14 +382,6 @@ public class RecentsPanelView extends RelativeLayout implements OnItemClickListe          mRecentsScrim = findViewById(R.id.recents_bg_protect);          mRecentsNoApps = findViewById(R.id.recents_no_apps);          mChoreo = new Choreographer(this, mRecentsScrim, mRecentsContainer, mRecentsNoApps, this); -        mRecentsDismissButton = findViewById(R.id.recents_dismiss_button); -        if (mRecentsDismissButton != null) { -            mRecentsDismissButton.setOnClickListener(new OnClickListener() { -                public void onClick(View v) { -                    hide(true); -                } -            }); -        }          // In order to save space, we make the background texture repeat in the Y direction          if (mRecentsScrim != null && mRecentsScrim.getBackground() instanceof BitmapDrawable) { diff --git a/packages/SystemUI/src/com/android/systemui/recent/StatusBarTouchProxy.java b/packages/SystemUI/src/com/android/systemui/recent/StatusBarTouchProxy.java new file mode 100644 index 000000000000..ded114ff6d62 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recent/StatusBarTouchProxy.java @@ -0,0 +1,40 @@ +/* + * 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.recent; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.FrameLayout; + +public class StatusBarTouchProxy extends FrameLayout { + +    private View mStatusBar; + +    public StatusBarTouchProxy(Context context, AttributeSet attrs) { +        super(context, attrs); +    } + +    public void setStatusBar(View statusBar) { +        mStatusBar = statusBar; +    } + +    public boolean onTouchEvent (MotionEvent event) { +        return mStatusBar.dispatchTouchEvent(event); +    } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index bf2d5e88addd..f8dfa8fcf6b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -62,6 +62,8 @@ public class CommandQueue extends IStatusBar.Stub {      private static final int MSG_TOGGLE_RECENT_APPS       = 11 << MSG_SHIFT; +    private static final int MSG_SET_NAVIGATION_ICON_HINTS = 13 << MSG_SHIFT; +      private StatusBarIconList mList;      private Callbacks mCallbacks;      private Handler mHandler = new H(); @@ -90,6 +92,7 @@ public class CommandQueue extends IStatusBar.Stub {          public void setImeWindowStatus(IBinder token, int vis, int backDisposition);          public void setHardKeyboardStatus(boolean available, boolean enabled);          public void toggleRecentApps(); +        public void setNavigationIconHints(int hints);      }      public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -196,6 +199,13 @@ public class CommandQueue extends IStatusBar.Stub {          }      } +    public void setNavigationIconHints(int hints) { +        synchronized (mList) { +            mHandler.removeMessages(MSG_SET_NAVIGATION_ICON_HINTS); +            mHandler.obtainMessage(MSG_SET_NAVIGATION_ICON_HINTS, hints, 0, null).sendToTarget(); +        } +    } +      private final class H extends Handler {          public void handleMessage(Message msg) {              final int what = msg.what & MSG_MASK; @@ -265,6 +275,9 @@ public class CommandQueue extends IStatusBar.Stub {                  case MSG_TOGGLE_RECENT_APPS:                      mCallbacks.toggleRecentApps();                      break; +                case MSG_SET_NAVIGATION_ICON_HINTS: +                    mCallbacks.setNavigationIconHints(msg.arg1); +                    break;              }          }      } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 005d12f1bdb6..6574c7dd71ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -18,6 +18,8 @@ package com.android.systemui.statusbar.phone;  import android.animation.Animator;  import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.app.StatusBarManager;  import android.content.Context;  import android.content.res.Resources;  import android.graphics.Rect; @@ -33,6 +35,7 @@ import android.view.View;  import android.view.ViewGroup;  import android.view.Surface;  import android.view.WindowManager; +import android.widget.ImageView;  import android.widget.LinearLayout;  import java.io.FileDescriptor; @@ -63,6 +66,7 @@ public class NavigationBarView extends LinearLayout {      boolean mHidden, mLowProfile, mShowMenu;      int mDisabledFlags = 0; +    int mNavigationIconHints = 0;      // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288)      final static boolean WORKAROUND_INVALID_LAYOUT = true; @@ -143,6 +147,34 @@ public class NavigationBarView extends LinearLayout {          }      }; +    public void setNavigationIconHints(int hints) { +        setNavigationIconHints(hints, false); +    } + +    public void setNavigationIconHints(int hints, boolean force) { +        if (!force && hints == mNavigationIconHints) return; + +        if (DEBUG) { +            android.widget.Toast.makeText(mContext, +                "Navigation icon hints = " + hints, +                500).show(); +        } + +        mNavigationIconHints = hints; + +        getBackButton().setAlpha( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP)) ? 0.5f : 1.0f); +        getHomeButton().setAlpha( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP)) ? 0.5f : 1.0f); +        getRecentsButton().setAlpha( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f); + +        ((ImageView)getBackButton()).setImageResource( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT)) +                ? R.drawable.ic_sysbar_back_ime +                : R.drawable.ic_sysbar_back); +    } +      public void setDisabledFlags(int disabledFlags) {          setDisabledFlags(disabledFlags, false);      } @@ -272,6 +304,8 @@ public class NavigationBarView extends LinearLayout {          if (DEBUG) {              Slog.d(TAG, "reorient(): rot=" + mDisplay.getRotation());          } + +        setNavigationIconHints(mNavigationIconHints, true);      }      @Override 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 3c9d12ce2221..5a1e3f440edd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -32,6 +32,7 @@ import android.content.pm.ApplicationInfo;  import android.content.pm.PackageManager.NameNotFoundException;  import android.content.res.Resources;  import android.content.res.Configuration; +import android.inputmethodservice.InputMethodService;  import android.graphics.PixelFormat;  import android.graphics.Rect;  import android.graphics.drawable.Drawable; @@ -229,6 +230,8 @@ public class PhoneStatusBar extends StatusBar {      DisplayMetrics mDisplayMetrics = new DisplayMetrics(); +    private int mNavigationIconHints = 0; +      private class ExpandedDialog extends Dialog {          ExpandedDialog(Context context) {              super(context, com.android.internal.R.style.Theme_Translucent_NoTitleBar); @@ -1541,6 +1544,17 @@ public class PhoneStatusBar extends StatusBar {      }      @Override // CommandQueue +    public void setNavigationIconHints(int hints) { +        if (hints == mNavigationIconHints) return; + +        mNavigationIconHints = hints; + +        if (mNavigationBarView != null) { +            mNavigationBarView.setNavigationIconHints(hints); +        } +    } + +    @Override // CommandQueue      public void setSystemUiVisibility(int vis) {          final int old = mSystemUiVisibility;          final int diff = vis ^ old; @@ -1590,8 +1604,16 @@ public class PhoneStatusBar extends StatusBar {          if (showMenu) setLightsOn(true);      } -    // Not supported -    public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { } +    @Override +    public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { +        boolean altBack = (backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS) +            || ((vis & InputMethodService.IME_VISIBLE) != 0); + +        mCommandQueue.setNavigationIconHints( +                altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT) +                        : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT)); +    } +      @Override      public void setHardKeyboardStatus(boolean available, boolean enabled) { } 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 6913239db572..09e38ff31434 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -88,7 +88,8 @@ import com.android.systemui.statusbar.policy.Prefs;  public class TabletStatusBar extends StatusBar implements          HeightReceiver.OnBarHeightChangedListener, -        InputMethodsPanel.OnHardKeyboardEnabledChangeListener { +        InputMethodsPanel.OnHardKeyboardEnabledChangeListener, +        RecentsPanelView.OnRecentsPanelVisibilityChangedListener {      public static final boolean DEBUG = false;      public static final boolean DEBUG_COMPAT_HELP = false;      public static final String TAG = "TabletStatusBar"; @@ -121,6 +122,8 @@ public class TabletStatusBar extends StatusBar implements      int mNaturalBarHeight = -1;      int mIconSize = -1;      int mIconHPadding = -1; +    int mNavIconWidth = -1; +    int mMenuNavIconWidth = -1;      private int mMaxNotificationIcons = 5;      H mHandler = new H(); @@ -143,6 +146,7 @@ public class TabletStatusBar extends StatusBar implements      View mHomeButton;      View mMenuButton;      View mRecentButton; +    private boolean mAltBackButtonEnabledForIme;      ViewGroup mFeedbackIconArea; // notification icons, IME icon, compat icon      InputMethodButton mInputMethodSwitchButton; @@ -193,6 +197,8 @@ public class TabletStatusBar extends StatusBar implements      // used to notify status bar for suppressing notification LED      private boolean mPanelSlightlyVisible; +    private int mNavigationIconHints = 0; +      public Context getContext() { return mContext; }      protected void addPanelWindows() { @@ -305,12 +311,11 @@ public class TabletStatusBar extends StatusBar implements          mRecentsPanel = (RecentsPanelView) View.inflate(context,                  R.layout.status_bar_recent_panel, null);          mRecentsPanel.setVisibility(View.GONE); -        mRecentsPanel.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);          mRecentsPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_RECENTS_PANEL,                  mRecentsPanel)); +        mRecentsPanel.setOnVisibilityChangedListener(this);          mRecentsPanel.setRecentTasksLoader(mRecentTasksLoader);          mRecentTasksLoader.setRecentsPanel(mRecentsPanel); -        mStatusBarView.setIgnoreChildren(2, mRecentButton, mRecentsPanel);          lp = new WindowManager.LayoutParams(                  (int) res.getDimension(R.dimen.status_bar_recents_width), @@ -329,6 +334,7 @@ public class TabletStatusBar extends StatusBar implements          WindowManagerImpl.getDefault().addView(mRecentsPanel, lp);          mRecentsPanel.setBar(this); +        mRecentsPanel.setStatusBarView(mStatusBarView);          // Input methods Panel          mInputMethodsPanel = (InputMethodsPanel) View.inflate(context, @@ -337,7 +343,7 @@ public class TabletStatusBar extends StatusBar implements          mInputMethodsPanel.setOnTouchListener(new TouchOutsideListener(                  MSG_CLOSE_INPUT_METHODS_PANEL, mInputMethodsPanel));          mInputMethodsPanel.setImeSwitchButton(mInputMethodSwitchButton); -        mStatusBarView.setIgnoreChildren(3, mInputMethodSwitchButton, mInputMethodsPanel); +        mStatusBarView.setIgnoreChildren(2, mInputMethodSwitchButton, mInputMethodsPanel);          lp = new WindowManager.LayoutParams(                  ViewGroup.LayoutParams.WRAP_CONTENT,                  ViewGroup.LayoutParams.WRAP_CONTENT, @@ -360,7 +366,7 @@ public class TabletStatusBar extends StatusBar implements                  MSG_CLOSE_COMPAT_MODE_PANEL, mCompatModePanel));          mCompatModePanel.setTrigger(mCompatModeButton);          mCompatModePanel.setVisibility(View.GONE); -        mStatusBarView.setIgnoreChildren(4, mCompatModeButton, mCompatModePanel); +        mStatusBarView.setIgnoreChildren(3, mCompatModeButton, mCompatModePanel);          lp = new WindowManager.LayoutParams(                  250,                  ViewGroup.LayoutParams.WRAP_CONTENT, @@ -410,6 +416,26 @@ public class TabletStatusBar extends StatusBar implements              com.android.internal.R.dimen.system_bar_icon_size);          int newIconHPadding = res.getDimensionPixelSize(              R.dimen.status_bar_icon_padding); +        int newNavIconWidth = res.getDimensionPixelSize(R.dimen.navigation_key_width); +        int newMenuNavIconWidth = res.getDimensionPixelSize(R.dimen.navigation_menu_key_width); + +        if (mNavigationArea != null && newNavIconWidth != mNavIconWidth) { +            mNavIconWidth = newNavIconWidth; + +            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( +                     mNavIconWidth, ViewGroup.LayoutParams.MATCH_PARENT); +            mBackButton.setLayoutParams(lp); +            mHomeButton.setLayoutParams(lp); +            mRecentButton.setLayoutParams(lp); +        } + +        if (mNavigationArea != null && newMenuNavIconWidth != mMenuNavIconWidth) { +            mMenuNavIconWidth = newMenuNavIconWidth; + +            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( +                     mMenuNavIconWidth, ViewGroup.LayoutParams.MATCH_PARENT); +            mMenuButton.setLayoutParams(lp); +        }          if (newIconHPadding != mIconHPadding || newIconSize != mIconSize) {  //            Slog.d(TAG, "size=" + newIconSize + " padding=" + newIconHPadding); @@ -426,6 +452,10 @@ public class TabletStatusBar extends StatusBar implements          }      } +    public View getStatusBarView() { +        return mStatusBarView; +    } +      protected View makeStatusBarView() {          final Context context = mContext; @@ -1087,6 +1117,31 @@ public class TabletStatusBar extends StatusBar implements          }      } +    @Override // CommandQueue +    public void setNavigationIconHints(int hints) { +        if (hints == mNavigationIconHints) return; + +        if (DEBUG) { +            android.widget.Toast.makeText(mContext, +                "Navigation icon hints = " + hints, +                500).show(); +        } + +        mNavigationIconHints = hints; + +        mBackButton.setAlpha( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP)) ? 0.5f : 1.0f); +        mHomeButton.setAlpha( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP)) ? 0.5f : 1.0f); +        mRecentButton.setAlpha( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f); + +        mBackButton.setImageResource( +            (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT)) +                ? R.drawable.ic_sysbar_back_ime +                : R.drawable.ic_sysbar_back); +    } +      private void notifyUiVisibilityChanged() {          try {              mWindowManager.statusBarVisibilityChanged(mSystemUiVisibility); @@ -1190,24 +1245,15 @@ public class TabletStatusBar extends StatusBar implements                  (vis & InputMethodService.IME_ACTIVE) != 0);          updateNotificationIcons();          mInputMethodsPanel.setImeToken(token); -        int res; -        switch (backDisposition) { -            case InputMethodService.BACK_DISPOSITION_WILL_NOT_DISMISS: -                res = R.drawable.ic_sysbar_back; -                break; -            case InputMethodService.BACK_DISPOSITION_WILL_DISMISS: -                res = R.drawable.ic_sysbar_back_ime; -                break; -            case InputMethodService.BACK_DISPOSITION_DEFAULT: -            default: -                if ((vis & InputMethodService.IME_VISIBLE) != 0) { -                    res = R.drawable.ic_sysbar_back_ime; -                } else { -                    res = R.drawable.ic_sysbar_back; -                } -                break; -        } -        mBackButton.setImageResource(res); + +        boolean altBack = (backDisposition == InputMethodService.BACK_DISPOSITION_WILL_DISMISS) +            || ((vis & InputMethodService.IME_VISIBLE) != 0); +        mAltBackButtonEnabledForIme = altBack; + +        mCommandQueue.setNavigationIconHints( +                altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT) +                        : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT)); +          if (FAKE_SPACE_BAR) {              mFakeSpaceBar.setVisibility(((vis & InputMethodService.IME_VISIBLE) != 0)                      ? View.VISIBLE : View.GONE); @@ -1215,6 +1261,14 @@ public class TabletStatusBar extends StatusBar implements      }      @Override +    public void onRecentsPanelVisibilityChanged(boolean visible) { +        boolean altBack = visible || mAltBackButtonEnabledForIme; +        mCommandQueue.setNavigationIconHints( +                altBack ? (mNavigationIconHints | StatusBarManager.NAVIGATION_HINT_BACK_ALT) +                        : (mNavigationIconHints & ~StatusBarManager.NAVIGATION_HINT_BACK_ALT)); +    } + +    @Override      public void setHardKeyboardStatus(boolean available, boolean enabled) {          if (DEBUG) {              Slog.d(TAG, "Set hard keyboard status: available=" + available diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java index 7d112516a9d0..877a40efae31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java @@ -46,10 +46,11 @@ public class TabletStatusBarView extends FrameLayout {              if (TabletStatusBar.DEBUG) {                  Slog.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev);              } +            // do not close the recents panel here- the intended behavior is that recents is dismissed +            // on touch up when clicking on status bar buttons +            // TODO: should we be closing the notification panel and input methods panel?              mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL);              mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); -            mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL); -            mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL);              mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL);              mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL);              mHandler.removeMessages(TabletStatusBar.MSG_STOP_TICKER); |