diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.png deleted file mode 100644 index eb6eb0c82391a..0000000000000 Binary files a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_default.png and /dev/null differ diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_pressed.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_pressed.png deleted file mode 100644 index 11f66f547cf04..0000000000000 Binary files a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_ime_pressed.png and /dev/null differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.png deleted file mode 100644 index f907de7e73aa0..0000000000000 Binary files a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_default.png and /dev/null differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.png deleted file mode 100644 index 36f8853a21a06..0000000000000 Binary files a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_ime_pressed.png and /dev/null differ diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_ime_default.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_ime_default.png new file mode 100644 index 0000000000000..1a9d88c0b664a Binary files /dev/null and b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_ime_default.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_ime_pressed.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_ime_pressed.png new file mode 100644 index 0000000000000..a6d7507dd30b7 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_ime_pressed.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_default.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_default.png index e2584e3a2f9a7..1e1324a6bb19d 100644 Binary files a/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_default.png and b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_default.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_pressed.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_pressed.png index 58b85102d9b31..e4e13c52b3026 100644 Binary files a/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_pressed.png and b/packages/SystemUI/res/drawable-sw600dp-hdpi/ic_sysbar_zoom_pressed.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_ime_default.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_ime_default.png new file mode 100644 index 0000000000000..33edce00137ca Binary files /dev/null and b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_ime_default.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_ime_pressed.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_ime_pressed.png new file mode 100644 index 0000000000000..8bab6cf338f78 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_ime_pressed.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_default.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_default.png index 2795c345f62ef..89d486f391dec 100644 Binary files a/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_default.png and b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_default.png differ diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_pressed.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_pressed.png index bbed6a6467d6b..b134436072556 100644 Binary files a/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_pressed.png and b/packages/SystemUI/res/drawable-sw600dp-mdpi/ic_sysbar_zoom_pressed.png differ diff --git a/packages/SystemUI/res/drawable/ic_sysbar_zoom.xml b/packages/SystemUI/res/drawable/ic_sysbar_zoom.xml index 977e00205e6fd..97d0348f0a3bf 100644 --- a/packages/SystemUI/res/drawable/ic_sysbar_zoom.xml +++ b/packages/SystemUI/res/drawable/ic_sysbar_zoom.xml @@ -16,6 +16,7 @@ + diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar.xml b/packages/SystemUI/res/layout-sw600dp/status_bar.xml index 707a8cb56f730..d9f3f2324499c 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar.xml @@ -75,13 +75,6 @@ systemui:keyCode="82" android:visibility="invisible" /> - diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml new file mode 100644 index 0000000000000..c151565fe798f --- /dev/null +++ b/packages/SystemUI/res/layout-sw600dp/status_bar_compat_mode_panel.xml @@ -0,0 +1,43 @@ + + + + + + + + + diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_notification_area.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_area.xml index f53b29e36beb7..fecfe7f1ae1b2 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar_notification_area.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar_notification_area.xml @@ -27,7 +27,7 @@ > - + + + - diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index dec8b672734b9..944e0eeffe6d2 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -26,5 +26,6 @@ 512dp 770dp + + 56dp - diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 446827b2869ed..973a4b2849ed5 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -143,4 +143,11 @@ Use by default for this USB accessory + + Zoom to fill screen + + + Stretch to fill screen diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java index c3052e8c3d2cd..7fbf7344a25be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java @@ -27,7 +27,8 @@ import android.widget.ImageView; import com.android.systemui.R; -public class CompatModeButton extends ImageView implements View.OnClickListener { +public class CompatModeButton extends ImageView { + private static final boolean DEBUG = false; private static final String TAG = "StatusBar.CompatModeButton"; private ActivityManager mAM; @@ -43,22 +44,14 @@ public class CompatModeButton extends ImageView implements View.OnClickListener mAM = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - setOnClickListener(this); - refresh(); } - @Override - public void onClick(View v) { - mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_TOGGLE); - } - public void refresh() { int mode = mAM.getFrontActivityScreenCompatMode(); - setVisibility((mode == ActivityManager.COMPAT_MODE_NEVER - || mode == ActivityManager.COMPAT_MODE_ALWAYS) - ? View.GONE - : View.VISIBLE - ); + final boolean vis = (mode != ActivityManager.COMPAT_MODE_NEVER + && mode != ActivityManager.COMPAT_MODE_ALWAYS); + if (DEBUG) Slog.d(TAG, "compat mode is " + mode + "; icon will " + (vis ? "show" : "hide")); + setVisibility(vis ? View.VISIBLE : View.GONE); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java new file mode 100644 index 0000000000000..5a82d1b47e57e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/CompatModePanel.java @@ -0,0 +1,115 @@ +/* + * 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 android.app.ActivityManager; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.RemoteException; +import android.util.AttributeSet; +import android.util.Slog; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +import com.android.systemui.R; + +public class CompatModePanel extends FrameLayout implements StatusBarPanel, + View.OnClickListener { + private static final boolean DEBUG = TabletStatusBar.DEBUG; + private static final String TAG = "CompatModePanel"; + + private ActivityManager mAM; + + private boolean mAttached = false; + private Context mContext; + private RadioButton mOnButton, mOffButton; + + private View mTrigger; +// private InputMethodButton mInputMethodSwitchButton; + + public CompatModePanel(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + mAM = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + } + + @Override + public void onFinishInflate() { + mOnButton = (RadioButton) findViewById(R.id.compat_mode_on_radio); + mOffButton = (RadioButton) findViewById(R.id.compat_mode_off_radio); + mOnButton.setOnClickListener(this); + mOffButton.setOnClickListener(this); + + refresh(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mAttached) { + mAttached = false; + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (!mAttached) { + mAttached = true; + } + } + + @Override + public void onClick(View v) { + if (v == mOnButton) { + mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_ENABLED); + } else if (v == mOffButton) { + mAM.setFrontActivityScreenCompatMode(ActivityManager.COMPAT_MODE_DISABLED); + } + } + + @Override + public boolean isInContentArea(int x, int y) { + return false; + } + + public void setTrigger(View v) { + mTrigger = v; + } + + public void openPanel() { + setVisibility(View.VISIBLE); + if (mTrigger != null) mTrigger.setSelected(true); + refresh(); + } + + public void closePanel() { + setVisibility(View.GONE); + if (mTrigger != null) mTrigger.setSelected(false); + } + + private void refresh() { + int mode = mAM.getFrontActivityScreenCompatMode(); + final boolean on = (mode == ActivityManager.COMPAT_MODE_ENABLED); + mOnButton.setChecked(on); + mOffButton.setChecked(!on); + } + +} 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 b304ebca2a67b..412cfc7944c12 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -92,6 +92,8 @@ public class TabletStatusBar extends StatusBar implements public static final int MSG_HIDE_CHROME = 1031; public static final int MSG_OPEN_INPUT_METHODS_PANEL = 1040; public static final int MSG_CLOSE_INPUT_METHODS_PANEL = 1041; + public static final int MSG_OPEN_COMPAT_MODE_PANEL = 1050; + public static final int MSG_CLOSE_COMPAT_MODE_PANEL = 1051; public static final int MSG_STOP_TICKER = 2000; // Fitts' Law assistance for LatinIME; see policy.EventHole @@ -125,8 +127,9 @@ public class TabletStatusBar extends StatusBar implements View mMenuButton; View mRecentButton; - ViewGroup mNotificationAndImeArea; + ViewGroup mFeedbackIconArea; // notification icons, IME icon, compat icon InputMethodButton mInputMethodSwitchButton; + CompatModeButton mCompatModeButton; NotificationPanel mNotificationPanel; WindowManager.LayoutParams mNotificationPanelParams; @@ -165,6 +168,7 @@ public class TabletStatusBar extends StatusBar implements private RecentAppsPanel mRecentsPanel; private InputMethodsPanel mInputMethodsPanel; + private CompatModePanel mCompatModePanel; public Context getContext() { return mContext; } @@ -304,6 +308,29 @@ public class TabletStatusBar extends StatusBar implements lp.windowAnimations = R.style.Animation_RecentPanel; WindowManagerImpl.getDefault().addView(mInputMethodsPanel, lp); + + // Compatibility mode selector panel + mCompatModePanel = (CompatModePanel) View.inflate(context, + R.layout.status_bar_compat_mode_panel, null); + mCompatModePanel.setOnTouchListener(new TouchOutsideListener( + MSG_CLOSE_COMPAT_MODE_PANEL, mCompatModePanel)); + mCompatModePanel.setTrigger(mCompatModeButton); + mCompatModePanel.setVisibility(View.GONE); + mStatusBarView.setIgnoreChildren(4, mCompatModeButton, mCompatModePanel); + lp = new WindowManager.LayoutParams( + 250, + ViewGroup.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM + | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH + | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + PixelFormat.TRANSLUCENT); + lp.gravity = Gravity.BOTTOM | Gravity.RIGHT; + lp.setTitle("CompatModePanel"); + lp.windowAnimations = android.R.style.Animation_Dialog; + + WindowManagerImpl.getDefault().addView(mCompatModePanel, lp); } private int getNotificationPanelHeight() { @@ -430,11 +457,14 @@ public class TabletStatusBar extends StatusBar implements mNavigationArea.setLayoutTransition(mBarContentsLayoutTransition); // The bar contents buttons - mNotificationAndImeArea = (ViewGroup)sb.findViewById(R.id.notificationAndImeArea); + mFeedbackIconArea = (ViewGroup)sb.findViewById(R.id.feedbackIconArea); mInputMethodSwitchButton = (InputMethodButton) sb.findViewById(R.id.imeSwitchButton); // Overwrite the lister mInputMethodSwitchButton.setOnClickListener(mOnClickListener); + mCompatModeButton = (CompatModeButton) sb.findViewById(R.id.compatModeButton); + mCompatModeButton.setOnClickListener(mOnClickListener); + // for redirecting errant bar taps to the IME mFakeSpaceBar = sb.findViewById(R.id.fake_space_bar); @@ -646,6 +676,14 @@ public class TabletStatusBar extends StatusBar implements if (DEBUG) Slog.d(TAG, "closing input methods panel"); if (mInputMethodsPanel != null) mInputMethodsPanel.closePanel(false); break; + case MSG_OPEN_COMPAT_MODE_PANEL: + if (DEBUG) Slog.d(TAG, "opening compat panel"); + if (mCompatModePanel != null) mCompatModePanel.openPanel(); + break; + case MSG_CLOSE_COMPAT_MODE_PANEL: + if (DEBUG) Slog.d(TAG, "closing compat panel"); + if (mCompatModePanel != null) mCompatModePanel.closePanel(); + break; case MSG_SHOW_CHROME: if (DEBUG) Slog.d(TAG, "hiding shadows (lights on)"); mBarContents.setVisibility(View.VISIBLE); @@ -914,14 +952,14 @@ public class TabletStatusBar extends StatusBar implements if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { mTicker.add(key, n); - mNotificationAndImeArea.setVisibility(View.GONE); + mFeedbackIconArea.setVisibility(View.GONE); } } } // called by TabletTicker when it's done with all queued ticks public void doneTicking() { - mNotificationAndImeArea.setVisibility(View.VISIBLE); + mFeedbackIconArea.setVisibility(View.VISIBLE); } public void animateExpand() { @@ -939,6 +977,8 @@ public class TabletStatusBar extends StatusBar implements mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL); mHandler.removeMessages(MSG_CLOSE_INPUT_METHODS_PANEL); mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL); + mHandler.removeMessages(MSG_CLOSE_COMPAT_MODE_PANEL); + mHandler.sendEmptyMessage(MSG_CLOSE_COMPAT_MODE_PANEL); mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK); mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK); } @@ -965,9 +1005,8 @@ public class TabletStatusBar extends StatusBar implements // See above re: lights-out policy for legacy apps. if (windowVisible) setLightsOn(true); - // XXX: HACK: not sure if this is the best way to catch a new activity that might require a - // change in compatibility features, but it's a start. - ((CompatModeButton) mBarContents.findViewById(R.id.compat_button)).refresh(); + // XXX: this is broken: http://b/4603422 + mCompatModeButton.refresh(); } public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { @@ -1060,6 +1099,8 @@ public class TabletStatusBar extends StatusBar implements onClickRecentButton(); } else if (v == mInputMethodSwitchButton) { onClickInputMethodSwitchButton(); + } else if (v == mCompatModeButton) { + onClickCompatModeButton(); } } }; @@ -1102,6 +1143,13 @@ public class TabletStatusBar extends StatusBar implements mHandler.sendEmptyMessage(msg); } + public void onClickCompatModeButton() { + int msg = (mCompatModePanel.getVisibility() == View.GONE) ? + MSG_OPEN_COMPAT_MODE_PANEL : MSG_CLOSE_COMPAT_MODE_PANEL; + mHandler.removeMessages(msg); + mHandler.sendEmptyMessage(msg); + } + public NotificationClicker makeClicker(PendingIntent intent, String pkg, String tag, int id) { return new NotificationClicker(intent, pkg, tag, id); } @@ -1438,13 +1486,13 @@ public class TabletStatusBar extends StatusBar implements ArrayList toShow = new ArrayList(); - // When IME button is visible, the number of notification icons should be decremented - // to fit the upper limit. - // IME switcher icon is big and occupy width of one icon - final int maxNotificationIconsImeButtonVisible = mMaxNotificationIcons - 1; - final int maxNotificationIconsCount = - (mInputMethodSwitchButton.getVisibility() != View.GONE) ? - maxNotificationIconsImeButtonVisible : mMaxNotificationIcons; + // Extra Special Icons + // The IME switcher and compatibility mode icons take the place of notifications. You didn't + // need to see all those new emails, did you? + int maxNotificationIconsCount = mMaxNotificationIcons; + if (mInputMethodSwitchButton.getVisibility() != View.GONE) maxNotificationIconsCount --; + if (mCompatModeButton.getVisibility() != View.GONE) maxNotificationIconsCount --; + for (int i=0; i< maxNotificationIconsCount; i++) { if (i>=N) break; toShow.add(mNotificationData.get(N-i-1).icon); 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 4e2faf7927711..dff1f6ada0e0b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarView.java @@ -27,8 +27,9 @@ import android.widget.FrameLayout; public class TabletStatusBarView extends FrameLayout { private Handler mHandler; - private final View[] mIgnoreChildren = new View[4]; - private final View[] mPanels = new View[4]; + private final int MAX_PANELS = 5; + private final View[] mIgnoreChildren = new View[MAX_PANELS]; + private final View[] mPanels = new View[MAX_PANELS]; private final int[] mPos = new int[2]; public TabletStatusBarView(Context context) {