From 9066cfe9886ac131c34d59ed0e2d287b0e3c0087 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 3 Mar 2009 19:31:44 -0800 Subject: auto import from //depot/cupcake/@135843 --- core/java/android/view/WindowManager.java | 959 ++++++++++++++++++++++++++++++ 1 file changed, 959 insertions(+) create mode 100644 core/java/android/view/WindowManager.java (limited to 'core/java/android/view/WindowManager.java') diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java new file mode 100644 index 0000000..b87cc42 --- /dev/null +++ b/core/java/android/view/WindowManager.java @@ -0,0 +1,959 @@ +/* + * Copyright (C) 2006 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 android.view; + +import android.content.pm.ActivityInfo; +import android.graphics.PixelFormat; +import android.os.IBinder; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; +import android.util.Log; + + +/** + * The interface that apps use to talk to the window manager. + *

+ * Use Context.getSystemService(Context.WINDOW_SERVICE) to get one of these. + * + * @see android.content.Context#getSystemService + * @see android.content.Context#WINDOW_SERVICE + */ +public interface WindowManager extends ViewManager { + /** + * Exception that is thrown when trying to add view whose + * {@link WindowManager.LayoutParams} {@link WindowManager.LayoutParams#token} + * is invalid. + */ + public static class BadTokenException extends RuntimeException { + public BadTokenException() { + } + + public BadTokenException(String name) { + super(name); + } + } + + /** + * Use this method to get the default Display object. + * + * @return default Display object + */ + public Display getDefaultDisplay(); + + /** + * Special variation of {@link #removeView} that immediately invokes + * the given view hierarchy's {@link View#onDetachedFromWindow() + * View.onDetachedFromWindow()} methods before returning. This is not + * for normal applications; using it correctly requires great care. + * + * @param view The view to be removed. + */ + public void removeViewImmediate(View view); + + public static class LayoutParams extends ViewGroup.LayoutParams + implements Parcelable { + /** + * X position for this window. With the default gravity it is ignored. + * When using {@link Gravity#LEFT} or {@link Gravity#RIGHT} it provides + * an offset from the given edge. + */ + public int x; + + /** + * Y position for this window. With the default gravity it is ignored. + * When using {@link Gravity#TOP} or {@link Gravity#BOTTOM} it provides + * an offset from the given edge. + */ + public int y; + + /** + * Indicates how much of the extra space will be allocated horizontally + * to the view associated with these LayoutParams. Specify 0 if the view + * should not be stretched. Otherwise the extra pixels will be pro-rated + * among all views whose weight is greater than 0. + */ + public float horizontalWeight; + + /** + * Indicates how much of the extra space will be allocated vertically + * to the view associated with these LayoutParams. Specify 0 if the view + * should not be stretched. Otherwise the extra pixels will be pro-rated + * among all views whose weight is greater than 0. + */ + public float verticalWeight; + + /** + * The general type of window. There are three main classes of + * window types: + *

+ * + * @see #TYPE_BASE_APPLICATION + * @see #TYPE_APPLICATION + * @see #TYPE_APPLICATION_STARTING + * @see #TYPE_APPLICATION_PANEL + * @see #TYPE_APPLICATION_MEDIA + * @see #TYPE_APPLICATION_SUB_PANEL + * @see #TYPE_APPLICATION_ATTACHED_DIALOG + * @see #TYPE_STATUS_BAR + * @see #TYPE_SEARCH_BAR + * @see #TYPE_PHONE + * @see #TYPE_SYSTEM_ALERT + * @see #TYPE_KEYGUARD + * @see #TYPE_TOAST + * @see #TYPE_SYSTEM_OVERLAY + * @see #TYPE_PRIORITY_PHONE + * @see #TYPE_STATUS_BAR_PANEL + * @see #TYPE_SYSTEM_DIALOG + * @see #TYPE_KEYGUARD_DIALOG + * @see #TYPE_SYSTEM_ERROR + * @see #TYPE_INPUT_METHOD + * @see #TYPE_INPUT_METHOD_DIALOG + */ + public int type; + + /** + * Start of window types that represent normal application windows. + */ + public static final int FIRST_APPLICATION_WINDOW = 1; + + /** + * Window type: an application window that serves as the "base" window + * of the overall application; all other application windows will + * appear on top of it. + */ + public static final int TYPE_BASE_APPLICATION = 1; + + /** + * Window type: a normal application window. The {@link #token} must be + * an Activity token identifying who the window belongs to. + */ + public static final int TYPE_APPLICATION = 2; + + /** + * Window type: special application window that is displayed while the + * application is starting. Not for use by applications themselves; + * this is used by the system to display something until the + * application can show its own windows. + */ + public static final int TYPE_APPLICATION_STARTING = 3; + + /** + * End of types of application windows. + */ + public static final int LAST_APPLICATION_WINDOW = 99; + + /** + * Start of types of sub-windows. The {@link #token} of these windows + * must be set to the window they are attached to. These types of + * windows are kept next to their attached window in Z-order, and their + * coordinate space is relative to their attached window. + */ + public static final int FIRST_SUB_WINDOW = 1000; + + /** + * Window type: a panel on top of an application window. These windows + * appear on top of their attached window. + */ + public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW; + + /** + * Window type: window for showing media (e.g. video). These windows + * are displayed behind their attached window. + */ + public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW+1; + + /** + * Window type: a sub-panel on top of an application window. These + * windows are displayed on top their attached window and any + * {@link #TYPE_APPLICATION_PANEL} panels. + */ + public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW+2; + + /** Window type: like {@link #TYPE_APPLICATION_PANEL}, but layout + * of the window happens as that of a top-level window, not + * as a child of its container. + */ + public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3; + + /** + * End of types of sub-windows. + */ + public static final int LAST_SUB_WINDOW = 1999; + + /** + * Start of system-specific window types. These are not normally + * created by applications. + */ + public static final int FIRST_SYSTEM_WINDOW = 2000; + + /** + * Window type: the status bar. There can be only one status bar + * window; it is placed at the top of the screen, and all other + * windows are shifted down so they are below it. + */ + public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW; + + /** + * Window type: the search bar. There can be only one search bar + * window; it is placed at the top of the screen. + */ + public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1; + + /** + * Window type: phone. These are non-application windows providing + * user interaction with the phone (in particular incoming calls). + * These windows are normally placed above all applications, but behind + * the status bar. + */ + public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2; + + /** + * Window type: system window, such as low power alert. These windows + * are always on top of application windows. + */ + public static final int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3; + + /** + * Window type: keyguard window. + */ + public static final int TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW+4; + + /** + * Window type: transient notifications. + */ + public static final int TYPE_TOAST = FIRST_SYSTEM_WINDOW+5; + + /** + * Window type: system overlay windows, which need to be displayed + * on top of everything else. These windows must not take input + * focus, or they will interfere with the keyguard. + */ + public static final int TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+6; + + /** + * Window type: priority phone UI, which needs to be displayed even if + * the keyguard is active. These windows must not take input + * focus, or they will interfere with the keyguard. + */ + public static final int TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW+7; + + /** + * Window type: panel that slides out from the status bar + */ + public static final int TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW+8; + + /** + * Window type: panel that slides out from the status bar + */ + public static final int TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW+8; + + /** + * Window type: dialogs that the keyguard shows + */ + public static final int TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW+9; + + /** + * Window type: internal system error windows, appear on top of + * everything they can. + */ + public static final int TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW+10; + + /** + * Window type: internal input methods windows, which appear above + * the normal UI. Application windows may be resized or panned to keep + * the input focus visible while this window is displayed. + */ + public static final int TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW+11; + + /** + * Window type: internal input methods dialog windows, which appear above + * the current input method window. + */ + public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW+12; + + /** + * End of types of system windows. + */ + public static final int LAST_SYSTEM_WINDOW = 2999; + + /** + * Specifies what type of memory buffers should be used by this window. + * Default is normal. + * + * @see #MEMORY_TYPE_NORMAL + * @see #MEMORY_TYPE_HARDWARE + * @see #MEMORY_TYPE_GPU + * @see #MEMORY_TYPE_PUSH_BUFFERS + */ + public int memoryType; + + /** Memory type: The window's surface is allocated in main memory. */ + public static final int MEMORY_TYPE_NORMAL = 0; + /** Memory type: The window's surface is configured to be accessible + * by DMA engines and hardware accelerators. */ + public static final int MEMORY_TYPE_HARDWARE = 1; + /** Memory type: The window's surface is configured to be accessible + * by graphics accelerators. */ + public static final int MEMORY_TYPE_GPU = 2; + /** Memory type: The window's surface doesn't own its buffers and + * therefore cannot be locked. Instead the buffers are pushed to + * it through native binder calls. */ + public static final int MEMORY_TYPE_PUSH_BUFFERS = 3; + + /** + * Various behavioral options/flags. Default is none. + * + * @see #FLAG_BLUR_BEHIND + * @see #FLAG_DIM_BEHIND + * @see #FLAG_NOT_FOCUSABLE + * @see #FLAG_NOT_TOUCHABLE + * @see #FLAG_NOT_TOUCH_MODAL + * @see #FLAG_LAYOUT_IN_SCREEN + * @see #FLAG_DITHER + * @see #FLAG_KEEP_SCREEN_ON + * @see #FLAG_FULLSCREEN + * @see #FLAG_FORCE_NOT_FULLSCREEN + * @see #FLAG_IGNORE_CHEEK_PRESSES + */ + public int flags; + + /** Window flag: everything behind this window will be dimmed. + * Use {@link #dimAmount} to control the amount of dim. */ + public static final int FLAG_DIM_BEHIND = 0x00000002; + + /** Window flag: blur everything behind this window. */ + public static final int FLAG_BLUR_BEHIND = 0x00000004; + + /** Window flag: this window won't ever get key input focus, so the + * user can not send key or other button events to it. Those will + * instead go to whatever focusable window is behind it. This flag + * will also enable {@link #FLAG_NOT_TOUCH_MODAL} whether or not that + * is explicitly set. + * + *

Setting this flag also implies that the window will not need to + * interact with + * a soft input method, so it will be Z-ordered and positioned + * independently of any active input method (typically this means it + * gets Z-ordered on top of the input method, so it can use the full + * screen for its content and cover the input method if needed. You + * can use {@link #FLAG_ALT_FOCUSABLE_IM} to modify this behavior. */ + public static final int FLAG_NOT_FOCUSABLE = 0x00000008; + + /** Window flag: this window can never receive touch events. */ + public static final int FLAG_NOT_TOUCHABLE = 0x00000010; + + /** Window flag: Even when this window is focusable (its + * {@link #FLAG_NOT_FOCUSABLE is not set), allow any pointer events + * outside of the window to be sent to the windows behind it. Otherwise + * it will consume all pointer events itself, regardless of whether they + * are inside of the window. */ + public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020; + + /** Window flag: When set, if the device is asleep when the touch + * screen is pressed, you will receive this first touch event. Usually + * the first touch event is consumed by the system since the user can + * not see what they are pressing on. + */ + public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040; + + /** Window flag: as long as this window is visible to the user, keep + * the device's screen turned on and bright. */ + public static final int FLAG_KEEP_SCREEN_ON = 0x00000080; + + /** Window flag: place the window within the entire screen, ignoring + * decorations around the border (a.k.a. the status bar). The + * window must correctly position its contents to take the screen + * decoration into account. This flag is normally set for you + * by Window as described in {@link Window#setFlags}. */ + public static final int FLAG_LAYOUT_IN_SCREEN = 0x00000100; + + /** Window flag: allow window to extend outside of the screen. */ + public static final int FLAG_LAYOUT_NO_LIMITS = 0x00000200; + + /** Window flag: Hide all screen decorations (e.g. status bar) while + * this window is displayed. This allows the window to use the entire + * display space for itself -- the status bar will be hidden when + * an app window with this flag set is on the top layer. */ + public static final int FLAG_FULLSCREEN = 0x00000400; + + /** Window flag: Override {@link #FLAG_FULLSCREEN and force the + * screen decorations (such as status bar) to be shown. */ + public static final int FLAG_FORCE_NOT_FULLSCREEN = 0x00000800; + + /** Window flag: turn on dithering when compositing this window to + * the screen. */ + public static final int FLAG_DITHER = 0x00001000; + + /** Window flag: don't allow screen shots while this window is + * displayed. */ + public static final int FLAG_SECURE = 0x00002000; + + /** Window flag: a special mode where the layout parameters are used + * to perform scaling of the surface when it is composited to the + * screen. */ + public static final int FLAG_SCALED = 0x00004000; + + /** Window flag: intended for windows that will often be used when the user is + * holding the screen against their face, it will aggressively filter the event + * stream to prevent unintended presses in this situation that may not be + * desired for a particular window, when such an event stream is detected, the + * application will receive a CANCEL motion event to indicate this so applications + * can handle this accordingly by taking no action on the event + * until the finger is released. */ + public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000; + + /** Window flag: a special option only for use in combination with + * {@link #FLAG_LAYOUT_IN_SCREEN}. When requesting layout in the + * screen your window may appear on top of or behind screen decorations + * such as the status bar. By also including this flag, the window + * manager will report the inset rectangle needed to ensure your + * content is not covered by screen decorations. This flag is normally + * set for you by Window as described in {@link Window#setFlags}.*/ + public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000; + + /** Window flag: invert the state of {@link #FLAG_NOT_FOCUSABLE} with + * respect to how this window interacts with the current method. That + * is, if FLAG_NOT_FOCUSABLE is set and this flag is set, then the + * window will behave as if it needs to interact with the input method + * and thus be placed behind/away from it; if FLAG_NOT_FOCUSABLE is + * not set and this flag is set, then the window will behave as if it + * doesn't need to interact with the input method and can be placed + * to use more space and cover the input method. + */ + public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000; + + /** Window flag: if you have set {@link #FLAG_NOT_TOUCH_MODAL}, you + * can set this flag to receive a single special MotionEvent with + * the action + * {@link MotionEvent#ACTION_OUTSIDE MotionEvent.ACTION_OUTSIDE} for + * touches that occur outside of your window. Note that you will not + * receive the full down/move/up gesture, only the location of the + * first down as an ACTION_OUTSIDE. + */ + public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000; + + /** Window flag: a special option intended for system dialogs. When + * this flag is set, the window will demand focus unconditionally when + * it is created. + * {@hide} */ + public static final int FLAG_SYSTEM_ERROR = 0x40000000; + + /** + * Given a particular set of window manager flags, determine whether + * such a window may be a target for an input method when it has + * focus. In particular, this checks the + * {@link #FLAG_NOT_FOCUSABLE} and {@link #FLAG_ALT_FOCUSABLE_IM} + * flags and returns true if the combination of the two corresponds + * to a window that needs to be behind the input method so that the + * user can type into it. + * + * @param flags The current window manager flags. + * + * @return Returns true if such a window should be behind/interact + * with an input method, false if not. + */ + public static boolean mayUseInputMethod(int flags) { + switch (flags&(FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM)) { + case 0: + case FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM: + return true; + } + return false; + } + + /** + * Mask for {@link #softInputMode} of the bits that determine the + * desired visibility state of the soft input area for this window. + */ + public static final int SOFT_INPUT_MASK_STATE = 0x0f; + + /** + * Visibility state for {@link #softInputMode}: no state has been specified. + */ + public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0; + + /** + * Visibility state for {@link #softInputMode}: please don't change the state of + * the soft input area. + */ + public static final int SOFT_INPUT_STATE_UNCHANGED = 1; + + /** + * Visibility state for {@link #softInputMode}: please hide any soft input + * area when normally appropriate (when the user is navigating + * forward to your window). + */ + public static final int SOFT_INPUT_STATE_HIDDEN = 2; + + /** + * Visibility state for {@link #softInputMode}: please always hide any + * soft input area when this window receives focus. + */ + public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3; + + /** + * Visibility state for {@link #softInputMode}: please show the soft + * input area when normally appropriate (when the user is navigating + * forward to your window). + */ + public static final int SOFT_INPUT_STATE_VISIBLE = 4; + + /** + * Visibility state for {@link #softInputMode}: please always make the + * soft input area visible when this window receives input focus. + */ + public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5; + + /** + * Mask for {@link #softInputMode} of the bits that determine the + * way that the window should be adjusted to accommodate the soft + * input window. + */ + public static final int SOFT_INPUT_MASK_ADJUST = 0xf0; + + /** Adjustment option for {@link #softInputMode}: nothing specified. + * The system will try to pick one or + * the other depending on the contents of the window. + */ + public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00; + + /** Adjustment option for {@link #softInputMode}: set to allow the + * window to be resized when an input + * method is shown, so that its contents are not covered by the input + * method. This can not be combined with + * {@link #SOFT_INPUT_ADJUST_PAN}; if + * neither of these are set, then the system will try to pick one or + * the other depending on the contents of the window. + */ + public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10; + + /** Adjustment option for {@link #softInputMode}: set to have a window + * pan when an input method is + * shown, so it doesn't need to deal with resizing but just panned + * by the framework to ensure the current input focus is visible. This + * can not be combined with {@link #SOFT_INPUT_ADJUST_RESIZE}; if + * neither of these are set, then the system will try to pick one or + * the other depending on the contents of the window. + */ + public static final int SOFT_INPUT_ADJUST_PAN = 0x20; + + /** + * Bit for {@link #softInputMode}: set when the user has navigated + * forward to the window. This is normally set automatically for + * you by the system, though you may want to set it in certain cases + * when you are displaying a window yourself. This flag will always + * be cleared automatically after the window is displayed. + */ + public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100; + + /** + * Desired operating mode for any soft input area. May any combination + * of: + * + *