Merge "Fix issue #4603422: Compatibility mode button doesn't always update" into honeycomb-mr2
This commit is contained in:
committed by
Android (Google) Code Review
commit
0a8a232423
@@ -31,7 +31,7 @@ oneway interface IStatusBar
|
||||
void animateExpand();
|
||||
void animateCollapse();
|
||||
void setLightsOn(boolean on);
|
||||
void setMenuKeyVisible(boolean visible);
|
||||
void topAppWindowChanged(boolean menuVisible);
|
||||
void setImeWindowStatus(in IBinder token, int vis, int backDisposition);
|
||||
void setHardKeyboardStatus(boolean available, boolean enabled);
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
package com.android.internal.statusbar;
|
||||
|
||||
import com.android.internal.statusbar.IStatusBar;
|
||||
@@ -30,7 +30,7 @@ interface IStatusBarService
|
||||
void setIcon(String slot, String iconPackage, int iconId, int iconLevel);
|
||||
void setIconVisibility(String slot, boolean visible);
|
||||
void removeIcon(String slot);
|
||||
void setMenuKeyVisible(boolean visible);
|
||||
void topAppWindowChanged(boolean menuVisible);
|
||||
void setImeWindowStatus(in IBinder token, int vis, int backDisposition);
|
||||
|
||||
// ---- Methods below are for use by the status bar policy services ----
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
<dimen name="status_bar_recents_thumbnail_max_height">64dp</dimen>
|
||||
<!-- Width of scrollable area in recents -->
|
||||
<dimen name="status_bar_recents_width">356dp</dimen>
|
||||
<!-- Amount to offset bottom of notification peek window from top of status bar. -->
|
||||
<dimen name="peek_window_y_offset">-12dp</dimen>
|
||||
|
||||
</resources>
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ public class CommandQueue extends IStatusBar.Stub {
|
||||
|
||||
private static final int MSG_SET_LIGHTS_ON = 0x00070000;
|
||||
|
||||
private static final int MSG_SHOW_MENU = 0x00080000;
|
||||
private static final int MSG_TOP_APP_WINDOW_CHANGED = 0x00080000;
|
||||
private static final int MSG_SHOW_IME_BUTTON = 0x00090000;
|
||||
private static final int MSG_SET_HARD_KEYBOARD_STATUS = 0x000a0000;
|
||||
|
||||
@@ -82,7 +82,7 @@ public class CommandQueue extends IStatusBar.Stub {
|
||||
public void animateExpand();
|
||||
public void animateCollapse();
|
||||
public void setLightsOn(boolean on);
|
||||
public void setMenuKeyVisible(boolean visible);
|
||||
public void topAppWindowChanged(boolean visible);
|
||||
public void setImeWindowStatus(IBinder token, int vis, int backDisposition);
|
||||
public void setHardKeyboardStatus(boolean available, boolean enabled);
|
||||
}
|
||||
@@ -160,10 +160,11 @@ public class CommandQueue extends IStatusBar.Stub {
|
||||
}
|
||||
}
|
||||
|
||||
public void setMenuKeyVisible(boolean visible) {
|
||||
public void topAppWindowChanged(boolean menuVisible) {
|
||||
synchronized (mList) {
|
||||
mHandler.removeMessages(MSG_SHOW_MENU);
|
||||
mHandler.obtainMessage(MSG_SHOW_MENU, visible ? 1 : 0, 0, null).sendToTarget();
|
||||
mHandler.removeMessages(MSG_TOP_APP_WINDOW_CHANGED);
|
||||
mHandler.obtainMessage(MSG_TOP_APP_WINDOW_CHANGED, menuVisible ? 1 : 0, 0,
|
||||
null).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,8 +241,8 @@ public class CommandQueue extends IStatusBar.Stub {
|
||||
case MSG_SET_LIGHTS_ON:
|
||||
mCallbacks.setLightsOn(msg.arg1 != 0);
|
||||
break;
|
||||
case MSG_SHOW_MENU:
|
||||
mCallbacks.setMenuKeyVisible(msg.arg1 != 0);
|
||||
case MSG_TOP_APP_WINDOW_CHANGED:
|
||||
mCallbacks.topAppWindowChanged(msg.arg1 != 0);
|
||||
break;
|
||||
case MSG_SHOW_IME_BUTTON:
|
||||
mCallbacks.setImeWindowStatus((IBinder)msg.obj, msg.arg1, msg.arg2);
|
||||
|
||||
@@ -78,7 +78,7 @@ public abstract class StatusBar extends SystemUI implements CommandQueue.Callbac
|
||||
|
||||
disable(switches[0]);
|
||||
setLightsOn(switches[1] != 0);
|
||||
setMenuKeyVisible(switches[2] != 0);
|
||||
topAppWindowChanged(switches[2] != 0);
|
||||
// StatusBarManagerService has a back up of IME token and it's restored here.
|
||||
setImeWindowStatus(binders.get(0), switches[3], switches[4]);
|
||||
setHardKeyboardStatus(switches[5] != 0, switches[6] != 0);
|
||||
|
||||
@@ -1019,7 +1019,7 @@ public class PhoneStatusBar extends StatusBar {
|
||||
}
|
||||
|
||||
// Not supported
|
||||
public void setMenuKeyVisible(boolean visible) { }
|
||||
public void topAppWindowChanged(boolean visible) { }
|
||||
public void setImeWindowStatus(IBinder token, int vis, int backDisposition) { }
|
||||
@Override
|
||||
public void setHardKeyboardStatus(boolean available, boolean enabled) { }
|
||||
|
||||
@@ -245,11 +245,12 @@ public class TabletStatusBar extends StatusBar implements
|
||||
512, // ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
|
||||
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
|
||||
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
|
||||
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
|
||||
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
|
||||
PixelFormat.TRANSLUCENT);
|
||||
lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
|
||||
lp.y = res.getDimensionPixelOffset(R.dimen.peek_window_y_offset);
|
||||
lp.setTitle("NotificationPeekWindow");
|
||||
lp.windowAnimations = com.android.internal.R.style.Animation_Toast;
|
||||
|
||||
@@ -955,14 +956,14 @@ public class TabletStatusBar extends StatusBar implements
|
||||
mHandler.sendEmptyMessage(on ? MSG_SHOW_CHROME : MSG_HIDE_CHROME);
|
||||
}
|
||||
|
||||
public void setMenuKeyVisible(boolean visible) {
|
||||
public void topAppWindowChanged(boolean windowVisible) {
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, (visible?"showing":"hiding") + " the MENU button");
|
||||
Slog.d(TAG, (windowVisible?"showing":"hiding") + " the MENU button");
|
||||
}
|
||||
mMenuButton.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
mMenuButton.setVisibility(windowVisible ? View.VISIBLE : View.GONE);
|
||||
|
||||
// See above re: lights-out policy for legacy apps.
|
||||
if (visible) setLightsOn(true);
|
||||
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.
|
||||
|
||||
@@ -324,6 +324,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
static final Rect mTmpVisibleFrame = new Rect();
|
||||
|
||||
WindowState mTopFullscreenOpaqueWindowState;
|
||||
WindowState mTopAppWindowState;
|
||||
WindowState mLastTopAppWindowState;
|
||||
boolean mTopIsFullscreen;
|
||||
boolean mForceStatusBar;
|
||||
boolean mHideLockScreen;
|
||||
@@ -334,7 +336,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
Intent mDeskDockIntent;
|
||||
int mShortcutKeyPressed = -1;
|
||||
boolean mConsumeShortcutKeyUp;
|
||||
boolean mShowMenuKey = false; // track FLAG_NEEDS_MENU_KEY on frontmost window
|
||||
|
||||
// support for activating the lock screen while the screen is on
|
||||
boolean mAllowLockscreenWhenOn;
|
||||
@@ -1842,12 +1843,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
// the status bar. They are protected by the STATUS_BAR_SERVICE
|
||||
// permission, so they have the same privileges as the status
|
||||
// bar itself.
|
||||
pf.left = df.left = cf.left = vf.left = mUnrestrictedScreenLeft;
|
||||
pf.top = df.top = cf.top = vf.top = mUnrestrictedScreenTop;
|
||||
pf.right = df.right = cf.right = vf.right
|
||||
= mUnrestrictedScreenLeft+mUnrestrictedScreenWidth;
|
||||
pf.bottom = df.bottom = cf.bottom = vf.bottom
|
||||
= mUnrestrictedScreenTop+mUnrestrictedScreenHeight;
|
||||
pf.left = df.left = cf.left = mRestrictedScreenLeft;
|
||||
pf.top = df.top = cf.top = mRestrictedScreenTop;
|
||||
pf.right = df.right = cf.right = mRestrictedScreenLeft+mRestrictedScreenWidth;
|
||||
pf.bottom = df.bottom = cf.bottom
|
||||
= mRestrictedScreenTop+mRestrictedScreenHeight;
|
||||
} else {
|
||||
pf.left = mContentLeft;
|
||||
pf.top = mContentTop;
|
||||
@@ -1915,6 +1915,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
/** {@inheritDoc} */
|
||||
public void beginAnimationLw(int displayWidth, int displayHeight) {
|
||||
mTopFullscreenOpaqueWindowState = null;
|
||||
mTopAppWindowState = null;
|
||||
mForceStatusBar = false;
|
||||
|
||||
mHideLockScreen = false;
|
||||
@@ -1950,6 +1951,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mTopAppWindowState == null && win.isVisibleOrBehindKeyguardLw()) {
|
||||
if (attrs.type >= FIRST_APPLICATION_WINDOW
|
||||
&& attrs.type <= LAST_APPLICATION_WINDOW) {
|
||||
mTopAppWindowState = win;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@@ -1993,22 +2000,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
}
|
||||
}
|
||||
|
||||
boolean topNeedsMenu = mShowMenuKey;
|
||||
if (lp != null) {
|
||||
topNeedsMenu = (lp.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0;
|
||||
}
|
||||
|
||||
if (DEBUG_LAYOUT) Log.v(TAG, "Top window "
|
||||
+ (topNeedsMenu ? "needs" : "does not need")
|
||||
+ " the MENU key");
|
||||
|
||||
mTopIsFullscreen = topIsFullscreen;
|
||||
final boolean changedMenu = (topNeedsMenu != mShowMenuKey);
|
||||
|
||||
if (changedMenu) {
|
||||
final boolean topNeedsMenuF = topNeedsMenu;
|
||||
if (mTopAppWindowState != null && mTopAppWindowState != mLastTopAppWindowState) {
|
||||
mLastTopAppWindowState = mTopAppWindowState;
|
||||
|
||||
mShowMenuKey = topNeedsMenu;
|
||||
final boolean topNeedsMenu = (mTopAppWindowState.getAttrs().flags
|
||||
& WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0;
|
||||
|
||||
mHandler.post(new Runnable() {
|
||||
public void run() {
|
||||
@@ -2023,9 +2021,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
final IStatusBarService sbs = mStatusBarService;
|
||||
if (mStatusBarService != null) {
|
||||
try {
|
||||
if (changedMenu) {
|
||||
sbs.setMenuKeyVisible(topNeedsMenuF);
|
||||
}
|
||||
sbs.topAppWindowChanged(topNeedsMenu);
|
||||
} catch (RemoteException e) {
|
||||
// This should be impossible because we're in the same process.
|
||||
mStatusBarService = null;
|
||||
|
||||
@@ -16,21 +16,16 @@
|
||||
|
||||
package com.android.server;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.app.StatusBarManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.net.Uri;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.Binder;
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
import android.util.Slog;
|
||||
import android.view.View;
|
||||
|
||||
@@ -248,25 +243,23 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
* Hide or show the on-screen Menu key. Only call this from the window manager, typically in
|
||||
* response to a window with FLAG_NEEDS_MENU_KEY set.
|
||||
*/
|
||||
public void setMenuKeyVisible(final boolean visible) {
|
||||
public void topAppWindowChanged(final boolean menuVisible) {
|
||||
enforceStatusBar();
|
||||
|
||||
if (SPEW) Slog.d(TAG, (visible?"showing":"hiding") + " MENU key");
|
||||
if (SPEW) Slog.d(TAG, (menuVisible?"showing":"hiding") + " MENU key");
|
||||
|
||||
synchronized(mLock) {
|
||||
if (mMenuVisible != visible) {
|
||||
mMenuVisible = visible;
|
||||
mHandler.post(new Runnable() {
|
||||
public void run() {
|
||||
if (mBar != null) {
|
||||
try {
|
||||
mBar.setMenuKeyVisible(visible);
|
||||
} catch (RemoteException ex) {
|
||||
}
|
||||
mMenuVisible = menuVisible;
|
||||
mHandler.post(new Runnable() {
|
||||
public void run() {
|
||||
if (mBar != null) {
|
||||
try {
|
||||
mBar.topAppWindowChanged(menuVisible);
|
||||
} catch (RemoteException ex) {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user