diff options
-rw-r--r-- | api/current.txt | 4 | ||||
-rw-r--r-- | api/system-current.txt | 4 | ||||
-rw-r--r-- | core/java/android/app/admin/DevicePolicyManager.java | 24 | ||||
-rw-r--r-- | core/java/android/provider/ContactsContract.java | 6 | ||||
-rw-r--r-- | core/java/android/view/PhoneFallbackEventHandler.java | 100 | ||||
-rw-r--r-- | core/java/android/widget/ListPopupWindow.java | 35 | ||||
-rw-r--r-- | core/java/android/widget/PopupWindow.java | 123 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java | 2 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java | 4 | ||||
-rw-r--r-- | services/core/java/com/android/server/media/MediaSessionService.java | 24 |
10 files changed, 209 insertions, 117 deletions
diff --git a/api/current.txt b/api/current.txt index ce47fe8..a469b58 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5664,11 +5664,13 @@ package android.app.admin { field public static final java.lang.String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE"; field public static final java.lang.String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME"; + field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION"; field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME"; + field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION"; @@ -39112,7 +39114,7 @@ package android.widget { method public void setTouchInterceptor(android.view.View.OnTouchListener); method public void setTouchable(boolean); method public void setWidth(int); - method public void setWindowLayoutMode(int, int); + method public deprecated void setWindowLayoutMode(int, int); method public void showAsDropDown(android.view.View); method public void showAsDropDown(android.view.View, int, int); method public void showAsDropDown(android.view.View, int, int, int); diff --git a/api/system-current.txt b/api/system-current.txt index 943cf81..8130dee 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5768,11 +5768,13 @@ package android.app.admin { field public static final java.lang.String EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE = "android.app.extra.PROVISIONING_ACCOUNT_TO_MIGRATE"; field public static final java.lang.String EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE = "android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME"; + field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION"; field public static final deprecated java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_COMPONENT_NAME"; + field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_CHECKSUM"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_COOKIE_HEADER"; field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION"; @@ -41772,7 +41774,7 @@ package android.widget { method public void setTouchInterceptor(android.view.View.OnTouchListener); method public void setTouchable(boolean); method public void setWidth(int); - method public void setWindowLayoutMode(int, int); + method public deprecated void setWindowLayoutMode(int, int); method public void showAsDropDown(android.view.View); method public void showAsDropDown(android.view.View, int, int); method public void showAsDropDown(android.view.View, int, int, int); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 682a468..2797bf0 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -341,6 +341,18 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION"; /** + * An int extra holding a minimum required version code for the device admin package. If the + * device admin is already installed on the device, it will only be re-downloaded from + * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION} if the version of the + * installed package is less than this version code. + * + * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner + * provisioning via an NFC bump. + */ + public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE + = "android.app.extra.PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE"; + + /** * A String extra holding a http cookie header which should be used in the http request to the * url specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. * @@ -411,6 +423,18 @@ public class DevicePolicyManager { = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION"; /** + * An int extra holding a minimum required version code for the device initializer package. + * If the initializer is already installed on the device, it will only be re-downloaded from + * {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION} if the version of + * the installed package is less than this version code. + * + * <p>Use in an NFC record with {@link #MIME_TYPE_PROVISIONING_NFC} that starts device owner + * provisioning via an NFC bump. + */ + public static final String EXTRA_PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE + = "android.app.extra.PROVISIONING_DEVICE_INITIALIZER_MINIMUM_VERSION_CODE"; + + /** * A String extra holding a http cookie header which should be used in the http request to the * url specified in {@link #EXTRA_PROVISIONING_DEVICE_INITIALIZER_PACKAGE_DOWNLOAD_LOCATION}. * diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 06862d7..74b0a1c 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -1516,8 +1516,14 @@ public final class ContactsContract { /** * Build a {@link #CONTENT_LOOKUP_URI} lookup {@link Uri} using the * given {@link ContactsContract.Contacts#_ID} and {@link #LOOKUP_KEY}. + * <p> + * Returns null if unable to construct a valid lookup URI from the + * provided parameters. */ public static Uri getLookupUri(long contactId, String lookupKey) { + if (TextUtils.isEmpty(lookupKey)) { + return null; + } return ContentUris.withAppendedId(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), contactId); } diff --git a/core/java/android/view/PhoneFallbackEventHandler.java b/core/java/android/view/PhoneFallbackEventHandler.java index fbf5732..350650d 100644 --- a/core/java/android/view/PhoneFallbackEventHandler.java +++ b/core/java/android/view/PhoneFallbackEventHandler.java @@ -25,8 +25,13 @@ import android.content.res.Configuration; import android.media.AudioManager; import android.media.session.MediaSessionLegacyHelper; import android.os.UserHandle; +import android.provider.Settings; import android.telephony.TelephonyManager; -import android.util.Slog; +import android.util.Log; +import android.view.View; +import android.view.HapticFeedbackConstants; +import android.view.FallbackEventHandler; +import android.view.KeyEvent; /** * @hide @@ -112,15 +117,20 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { dispatcher.startTracking(event, this); } else if (event.isLongPress() && dispatcher.isTracking(event)) { dispatcher.performedLongPress(event); - mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - // launch the VoiceDialer - Intent intent = new Intent(Intent.ACTION_VOICE_COMMAND); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - sendCloseSystemWindows(); - mContext.startActivity(intent); - } catch (ActivityNotFoundException e) { - startCallActivity(); + if (isUserSetupComplete()) { + mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + // launch the VoiceDialer + Intent intent = new Intent(Intent.ACTION_VOICE_COMMAND); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + sendCloseSystemWindows(); + mContext.startActivity(intent); + } catch (ActivityNotFoundException e) { + startCallActivity(); + } + } else { + Log.i(TAG, "Not starting call activity because user " + + "setup is in progress."); } } return true; @@ -134,13 +144,18 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { dispatcher.startTracking(event, this); } else if (event.isLongPress() && dispatcher.isTracking(event)) { dispatcher.performedLongPress(event); - mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - sendCloseSystemWindows(); - // Broadcast an intent that the Camera button was longpressed - Intent intent = new Intent(Intent.ACTION_CAMERA_BUTTON, null); - intent.putExtra(Intent.EXTRA_KEY_EVENT, event); - mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF, - null, null, null, 0, null, null); + if (isUserSetupComplete()) { + mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + sendCloseSystemWindows(); + // Broadcast an intent that the Camera button was longpressed + Intent intent = new Intent(Intent.ACTION_CAMERA_BUTTON, null); + intent.putExtra(Intent.EXTRA_KEY_EVENT, event); + mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF, + null, null, null, 0, null, null); + } else { + Log.i(TAG, "Not dispatching CAMERA long press because user " + + "setup is in progress."); + } } return true; } @@ -155,21 +170,26 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { Configuration config = mContext.getResources().getConfiguration(); if (config.keyboard == Configuration.KEYBOARD_NOKEYS || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { - // launch the search activity - Intent intent = new Intent(Intent.ACTION_SEARCH_LONG_PRESS); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - sendCloseSystemWindows(); - getSearchManager().stopSearch(); - mContext.startActivity(intent); - // Only clear this if we successfully start the - // activity; otherwise we will allow the normal short - // press action to be performed. - dispatcher.performedLongPress(event); - return true; - } catch (ActivityNotFoundException e) { - // Ignore + if (isUserSetupComplete()) { + // launch the search activity + Intent intent = new Intent(Intent.ACTION_SEARCH_LONG_PRESS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + sendCloseSystemWindows(); + getSearchManager().stopSearch(); + mContext.startActivity(intent); + // Only clear this if we successfully start the + // activity; otherwise we will allow the normal short + // press action to be performed. + dispatcher.performedLongPress(event); + return true; + } catch (ActivityNotFoundException e) { + // Ignore + } + } else { + Log.i(TAG, "Not dispatching SEARCH long press because user " + + "setup is in progress."); } } } @@ -181,7 +201,7 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { boolean onKeyUp(int keyCode, KeyEvent event) { if (DEBUG) { - Slog.d(TAG, "up " + keyCode); + Log.d(TAG, "up " + keyCode); } final KeyEvent.DispatcherState dispatcher = mView.getKeyDispatcherState(); if (dispatcher != null) { @@ -229,7 +249,12 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { break; } if (event.isTracking() && !event.isCanceled()) { - startCallActivity(); + if (isUserSetupComplete()) { + startCallActivity(); + } else { + Log.i(TAG, "Not starting call activity because user " + + "setup is in progress."); + } } return true; } @@ -244,7 +269,7 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { try { mContext.startActivity(intent); } catch (ActivityNotFoundException e) { - Slog.w(TAG, "No activity found for android.intent.action.CALL_BUTTON."); + Log.w(TAG, "No activity found for android.intent.action.CALL_BUTTON."); } } @@ -284,5 +309,10 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { private void handleMediaKeyEvent(KeyEvent keyEvent) { MediaSessionLegacyHelper.getHelper(mContext).sendMediaButtonEvent(keyEvent, false); } + + private boolean isUserSetupComplete() { + return Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.USER_SETUP_COMPLETE, 0) != 0; + } } diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index d85bbb9..310412f 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -567,13 +567,11 @@ public class ListPopupWindow { public void show() { int height = buildDropDown(); - int widthSpec = 0; - int heightSpec = 0; - boolean noInputMethod = isInputMethodNotNeeded(); mPopup.setAllowScrollingAnchorParent(!noInputMethod); if (mPopup.isShowing()) { + final int widthSpec; if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { // The call to PopupWindow's update method below can accept -1 for any // value you do not want to update. @@ -584,19 +582,19 @@ public class ListPopupWindow { widthSpec = mDropDownWidth; } + final int heightSpec; if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { // The call to PopupWindow's update method below can accept -1 for any // value you do not want to update. heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.MATCH_PARENT; if (noInputMethod) { - mPopup.setWindowLayoutMode( - mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? - ViewGroup.LayoutParams.MATCH_PARENT : 0, 0); + mPopup.setWidth(mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? + ViewGroup.LayoutParams.MATCH_PARENT : 0); + mPopup.setHeight(0); } else { - mPopup.setWindowLayoutMode( - mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? - ViewGroup.LayoutParams.MATCH_PARENT : 0, - ViewGroup.LayoutParams.MATCH_PARENT); + mPopup.setWidth(mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? + ViewGroup.LayoutParams.MATCH_PARENT : 0); + mPopup.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); } } else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { heightSpec = height; @@ -604,32 +602,37 @@ public class ListPopupWindow { heightSpec = mDropDownHeight; } + mPopup.setWidth(widthSpec); + mPopup.setHeight(heightSpec); mPopup.setOutsideTouchable(!mForceIgnoreOutsideTouch && !mDropDownAlwaysVisible); mPopup.update(getAnchorView(), mDropDownHorizontalOffset, - mDropDownVerticalOffset, widthSpec, heightSpec); + mDropDownVerticalOffset, -1, -1); } else { + final int widthSpec; if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { widthSpec = ViewGroup.LayoutParams.MATCH_PARENT; } else { if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { - mPopup.setWidth(getAnchorView().getWidth()); + widthSpec = getAnchorView().getWidth(); } else { - mPopup.setWidth(mDropDownWidth); + widthSpec = mDropDownWidth; } } + final int heightSpec; if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { heightSpec = ViewGroup.LayoutParams.MATCH_PARENT; } else { if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { - mPopup.setHeight(height); + heightSpec = height; } else { - mPopup.setHeight(mDropDownHeight); + heightSpec = mDropDownHeight; } } - mPopup.setWindowLayoutMode(widthSpec, heightSpec); + mPopup.setWidth(widthSpec); + mPopup.setHeight(heightSpec); mPopup.setClipToScreenEnabled(true); // use outside touchable to dismiss drop down when touching outside of it, so diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index f676254..8792323 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -46,6 +46,7 @@ import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.ViewTreeObserver.OnScrollChangedListener; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import java.lang.ref.WeakReference; @@ -126,10 +127,10 @@ public class PopupWindow { private OnTouchListener mTouchInterceptor; private int mWidthMode; - private int mWidth; + private int mWidth = LayoutParams.WRAP_CONTENT; private int mLastWidth; private int mHeightMode; - private int mHeight; + private int mHeight = LayoutParams.WRAP_CONTENT; private int mLastHeight; private int mPopupWidth; @@ -907,17 +908,19 @@ public class PopupWindow { * {@link ViewGroup.LayoutParams#WRAP_CONTENT}, * {@link ViewGroup.LayoutParams#MATCH_PARENT}, or 0 to use the absolute * height. + * + * @deprecated Use {@link #setWidth(int)} and {@link #setHeight(int)}. */ + @Deprecated public void setWindowLayoutMode(int widthSpec, int heightSpec) { mWidthMode = widthSpec; mHeightMode = heightSpec; } /** - * <p>Return this popup's height MeasureSpec</p> + * Returns the popup's height MeasureSpec. * * @return the height MeasureSpec of the popup - * * @see #setHeight(int) */ public int getHeight() { @@ -925,13 +928,12 @@ public class PopupWindow { } /** - * <p>Change the popup's height MeasureSpec</p> - * - * <p>If the popup is showing, calling this method will take effect only - * the next time the popup is shown.</p> + * Sets the popup's height MeasureSpec. + * <p> + * If the popup is showing, calling this method will take effect the next + * time the popup is shown. * * @param height the height MeasureSpec of the popup - * * @see #getHeight() * @see #isShowing() */ @@ -940,10 +942,9 @@ public class PopupWindow { } /** - * <p>Return this popup's width MeasureSpec</p> + * Returns the popup's width MeasureSpec. * * @return the width MeasureSpec of the popup - * * @see #setWidth(int) */ public int getWidth() { @@ -951,13 +952,12 @@ public class PopupWindow { } /** - * <p>Change the popup's width MeasureSpec</p> - * - * <p>If the popup is showing, calling this method will take effect only - * the next time the popup is shown.</p> + * Sets the popup's width MeasureSpec. + * <p> + * If the popup is showing, calling this method will take effect the next + * time the popup is shown. * * @param width the width MeasureSpec of the popup - * * @see #getWidth() * @see #isShowing() */ @@ -1658,10 +1658,17 @@ public class PopupWindow { /** * Updates the state of the popup window, if it is currently being displayed, - * from the currently set state. This includes: - * {@link #setClippingEnabled(boolean)}, {@link #setFocusable(boolean)}, - * {@link #setIgnoreCheekPress()}, {@link #setInputMethodMode(int)}, - * {@link #setTouchable(boolean)}, and {@link #setAnimationStyle(int)}. + * from the currently set state. + * <p> + * This includes: + * <ul> + * <li>{@link #setClippingEnabled(boolean)}</li> + * <li>{@link #setFocusable(boolean)}</li> + * <li>{@link #setIgnoreCheekPress()}</li> + * <li>{@link #setInputMethodMode(int)}</li> + * <li>{@link #setTouchable(boolean)}</li> + * <li>{@link #setAnimationStyle(int)}</li> + * </ul> */ public void update() { if (!isShowing() || mContentView == null) { @@ -1692,12 +1699,13 @@ public class PopupWindow { } /** - * <p>Updates the dimension of the popup window. Calling this function - * also updates the window with the current popup state as described - * for {@link #update()}.</p> + * Updates the dimension of the popup window. + * <p> + * Calling this function also updates the window with the current popup + * state as described for {@link #update()}. * - * @param width the new width - * @param height the new height + * @param width the new width, must be >= 0 or -1 to ignore + * @param height the new height, must be >= 0 or -1 to ignore */ public void update(int width, int height) { final WindowManager.LayoutParams p = @@ -1706,40 +1714,43 @@ public class PopupWindow { } /** - * <p>Updates the position and the dimension of the popup window. Width and - * height can be set to -1 to update location only. Calling this function - * also updates the window with the current popup state as - * described for {@link #update()}.</p> + * Updates the position and the dimension of the popup window. + * <p> + * Width and height can be set to -1 to update location only. Calling this + * function also updates the window with the current popup state as + * described for {@link #update()}. * * @param x the new x location * @param y the new y location - * @param width the new width, can be -1 to ignore - * @param height the new height, can be -1 to ignore + * @param width the new width, must be >= 0 or -1 to ignore + * @param height the new height, must be >= 0 or -1 to ignore */ public void update(int x, int y, int width, int height) { update(x, y, width, height, false); } /** - * <p>Updates the position and the dimension of the popup window. Width and - * height can be set to -1 to update location only. Calling this function - * also updates the window with the current popup state as - * described for {@link #update()}.</p> + * Updates the position and the dimension of the popup window. + * <p> + * Width and height can be set to -1 to update location only. Calling this + * function also updates the window with the current popup state as + * described for {@link #update()}. * * @param x the new x location * @param y the new y location - * @param width the new width, can be -1 to ignore - * @param height the new height, can be -1 to ignore - * @param force reposition the window even if the specified position - * already seems to correspond to the LayoutParams + * @param width the new width, must be >= 0 or -1 to ignore + * @param height the new height, must be >= 0 or -1 to ignore + * @param force {@code true} to reposition the window even if the specified + * position already seems to correspond to the LayoutParams, + * {@code false} to only reposition if needed */ public void update(int x, int y, int width, int height, boolean force) { - if (width != -1) { + if (width >= 0) { mLastWidth = width; setWidth(width); } - if (height != -1) { + if (height >= 0) { mLastHeight = height; setHeight(height); } @@ -1794,32 +1805,34 @@ public class PopupWindow { } /** - * <p>Updates the position and the dimension of the popup window. Calling this - * function also updates the window with the current popup state as described - * for {@link #update()}.</p> + * Updates the position and the dimension of the popup window. + * <p> + * Calling this function also updates the window with the current popup + * state as described for {@link #update()}. * * @param anchor the popup's anchor view - * @param width the new width, can be -1 to ignore - * @param height the new height, can be -1 to ignore + * @param width the new width, must be >= 0 or -1 to ignore + * @param height the new height, must be >= 0 or -1 to ignore */ public void update(View anchor, int width, int height) { update(anchor, false, 0, 0, true, width, height); } /** - * <p>Updates the position and the dimension of the popup window. Width and - * height can be set to -1 to update location only. Calling this function - * also updates the window with the current popup state as - * described for {@link #update()}.</p> - * - * <p>If the view later scrolls to move <code>anchor</code> to a different - * location, the popup will be moved correspondingly.</p> + * Updates the position and the dimension of the popup window. + * <p> + * Width and height can be set to -1 to update location only. Calling this + * function also updates the window with the current popup state as + * described for {@link #update()}. + * <p> + * If the view later scrolls to move {@code anchor} to a different + * location, the popup will be moved correspondingly. * * @param anchor the popup's anchor view * @param xoff x offset from the view's left edge * @param yoff y offset from the view's bottom edge - * @param width the new width, can be -1 to ignore - * @param height the new height, can be -1 to ignore + * @param width the new width, must be >= 0 or -1 to ignore + * @param height the new height, must be >= 0 or -1 to ignore */ public void update(View anchor, int xoff, int yoff, int width, int height) { update(anchor, true, xoff, yoff, true, width, height); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index 9263543..abeb2b0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -292,7 +292,7 @@ public class RecentsConfiguration { Settings.Global.DEVELOPMENT_SETTINGS_ENABLED) != 0; lockToAppEnabled = ssp.getSystemSetting(context, Settings.System.LOCK_TO_APP_ENABLED) != 0; - multiStackEnabled = "1".equals(ssp.getSystemProperty("overview.enableMultiStack")); + multiStackEnabled = "true".equals(ssp.getSystemProperty("persist.sys.debug.multi_window")); } /** Called when the configuration has changed, and we want to reset any configuration specific diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java index ca08319..56801e5 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java @@ -124,9 +124,6 @@ public class TaskViewHeader extends FrameLayout { mActivityDescription = (TextView) findViewById(R.id.activity_description); mDismissButton = (ImageView) findViewById(R.id.dismiss_task); mMoveTaskButton = (ImageView) findViewById(R.id.move_task); - if (mConfig.multiStackEnabled) { - mMoveTaskButton.setVisibility(View.VISIBLE); - } // Hide the backgrounds if they are ripple drawables if (!Constants.DebugFlags.App.EnableTaskFiltering) { @@ -209,6 +206,7 @@ public class TaskViewHeader extends FrameLayout { mLightDismissDrawable : mDarkDismissDrawable); mDismissButton.setContentDescription(String.format(mDismissContentDescription, t.activityLabel)); + mMoveTaskButton.setVisibility((mConfig.multiStackEnabled) ? View.VISIBLE : View.INVISIBLE); } /** Unbinds the bar view from the task */ diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index a530dfa..65949bf 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -55,6 +55,7 @@ import android.provider.Settings; import android.speech.RecognizerIntent; import android.text.TextUtils; import android.util.Log; +import android.util.Slog; import android.util.SparseArray; import android.view.KeyEvent; @@ -743,15 +744,23 @@ public class MediaSessionService extends SystemService implements Monitor { Log.w(TAG, "Attempted to dispatch null or non-media key event."); return; } + final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); - if (DEBUG) { - Log.d(TAG, "dispatchMediaKeyEvent, pid=" + pid + ", uid=" + uid + ", event=" - + keyEvent); - } - try { + if (DEBUG) { + Log.d(TAG, "dispatchMediaKeyEvent, pid=" + pid + ", uid=" + uid + ", event=" + + keyEvent); + } + if (!isUserSetupComplete()) { + // Global media key handling can have the side-effect of starting new + // activities which is undesirable while setup is in progress. + Slog.i(TAG, "Not dispatching media key event because user " + + "setup is in progress."); + return; + } + synchronized (mLock) { // If we don't have a media button receiver to fall back on // include non-playing sessions for dispatching @@ -1025,6 +1034,11 @@ public class MediaSessionService extends SystemService implements Monitor { return keyCode == KeyEvent.KEYCODE_HEADSETHOOK; } + private boolean isUserSetupComplete() { + return Settings.Secure.getIntForUser(getContext().getContentResolver(), + Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0; + } + // we only handle public stream types, which are 0-5 private boolean isValidLocalStreamType(int streamType) { return streamType >= AudioManager.STREAM_VOICE_CALL |