Merge "Add system insets to windows." into jb-dev
diff --git a/api/current.txt b/api/current.txt
index 4a9b3bb..cb523cf 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11283,10 +11283,11 @@
 
   public final class MediaRecorder.AudioEncoder {
     field public static final int AAC = 3; // 0x3
-    field public static final int AAC_ELD = 6; // 0x6
+    field public static final int AAC_ELD = 5; // 0x5
     field public static final int AMR_NB = 1; // 0x1
     field public static final int AMR_WB = 2; // 0x2
     field public static final int DEFAULT = 0; // 0x0
+    field public static final int HE_AAC = 4; // 0x4
   }
 
   public final class MediaRecorder.AudioSource {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 588bb06..092bcbd 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -4668,6 +4668,24 @@
                 info.addAction(AccessibilityNodeInfo.ACTION_FOCUS);
             }
         }
+
+        info.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
+        info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
+
+        if (isClickable()) {
+            info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
+        }
+
+        if (isLongClickable()) {
+            info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
+        }
+
+        if (getContentDescription() != null) {
+            info.addAction(AccessibilityNodeInfo.ACTION_NEXT_AT_GRANULARITY);
+            info.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_GRANULARITY);
+            info.setGranularities(AccessibilityNodeInfo.GRANULARITY_CHARACTER
+                    | AccessibilityNodeInfo.GRANULARITY_WORD);
+        }
     }
 
     /**
@@ -5942,7 +5960,8 @@
      * @hide
      */
     public boolean requestAccessibilityFocus() {
-        if (!AccessibilityManager.getInstance(mContext).isEnabled()) {
+        AccessibilityManager manager = AccessibilityManager.getInstance(mContext);
+        if (!manager.isEnabled() || !manager.isTouchExplorationEnabled()) {
             return false;
         }
         if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) {
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 467e285..bb7b3f8 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2438,7 +2438,6 @@
                 if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) {
                     handled = child.dispatchPopulateAccessibilityEvent(event);
                     if (handled) {
-                        children.recycle();
                         return handled;
                     }
                 }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 46bff84..9565547 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -636,6 +636,8 @@
                 if (view.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
                     view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
                 }
+
+                setAccessibilityFocusedHost(null);
             }
         }
     }
@@ -2317,7 +2319,8 @@
      * @param canvas The canvas on which to draw.
      */
     private void drawAccessibilityFocusedDrawableIfNeeded(Canvas canvas) {
-        if (!AccessibilityManager.getInstance(mView.mContext).isEnabled()) {
+        AccessibilityManager manager = AccessibilityManager.getInstance(mView.mContext);
+        if (!manager.isEnabled() || !manager.isTouchExplorationEnabled()) {
             return;
         }
         if (mAccessibilityFocusedHost == null || mAccessibilityFocusedHost.mAttachInfo == null) {
@@ -2340,6 +2343,9 @@
             if (mAccessibilityFocusedVirtualView == null) {
                 mAccessibilityFocusedVirtualView = provider.findAccessibilitiyFocus(View.NO_ID);
             }
+            if (mAccessibilityFocusedVirtualView == null) {
+                return;
+            }
             mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds);
             bounds.offset(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop);
         }
@@ -2866,6 +2872,8 @@
                         mHasHadWindowFocus = true;
                     }
 
+                    setAccessibilityFocusedHost(null);
+
                     if (mView != null && mAccessibilityManager.isEnabled()) {
                         if (hasWindowFocus) {
                             mView.sendAccessibilityEvent(
@@ -2884,9 +2892,6 @@
                             if (mAccessibilityFocusedHost == null) {
                                 mView.requestAccessibilityFocus();
                             }
-                        } else {
-                            // Clear accessibility focus when the window loses input focus.
-                            setAccessibilityFocusedHost(null);
                         }
                     }
                 }
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index b6fe6d8..a9b32b8 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -7890,7 +7890,9 @@
         ViewRootImpl viewRoot = mWebView.getViewRootImpl();
         if (mWebView.isHardwareAccelerated() && viewRoot != null) {
             functor = nativeGetDrawGLFunction(mNativeClass);
-            viewRoot.attachFunctor(functor);
+            if (functor != 0) {
+                viewRoot.attachFunctor(functor);
+            }
         }
 
         if (functor == 0
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index 233d892..02bb4f3 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -230,6 +230,7 @@
     public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
         super.onInitializeAccessibilityNodeInfo(info);
         info.setClassName(CheckedTextView.class.getName());
+        info.setCheckable(true);
         info.setChecked(mChecked);
     }
 }
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index e0b33cd..9af201d 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -251,14 +251,12 @@
         public static final int AMR_NB = 1;
         /** AMR (Wideband) audio codec */
         public static final int AMR_WB = 2;
-        /** AAC audio codec */
+        /** AAC Low Complexity (AAC-LC) audio codec */
         public static final int AAC = 3;
-        /** @hide enhanced AAC audio codec */
-        public static final int AAC_PLUS = 4;
-        /** @hide enhanced AAC plus audio codec */
-        public static final int EAAC_PLUS = 5;
-        /** AAC-ELD audio codec */
-        public static final int AAC_ELD = 6;
+        /** High Efficiency AAC (HE-AAC) audio codec */
+        public static final int HE_AAC = 4;
+        /** Enhanced Low Delay AAC (AAC-ELD) audio codec */
+        public static final int AAC_ELD = 5;
     }
 
     /**
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java
index b1d049e..abe8b8c 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaProfileReader.java
@@ -88,8 +88,7 @@
         if (audioEncoder != MediaRecorder.AudioEncoder.AMR_NB &&
             audioEncoder != MediaRecorder.AudioEncoder.AMR_WB &&
             audioEncoder != MediaRecorder.AudioEncoder.AAC &&
-            audioEncoder != MediaRecorder.AudioEncoder.AAC_PLUS &&
-            audioEncoder != MediaRecorder.AudioEncoder.EAAC_PLUS) {
+            audioEncoder != MediaRecorder.AudioEncoder.HE_AAC) {
             throw new IllegalArgumentException("Unsupported audio encodeer " + audioEncoder);
         }
         return audioEncoderMap.get(audioEncoder);
@@ -128,7 +127,6 @@
         audioEncoderMap.put(MediaRecorder.AudioEncoder.AMR_NB, "amrnb");
         audioEncoderMap.put(MediaRecorder.AudioEncoder.AMR_WB, "amrwb");
         audioEncoderMap.put(MediaRecorder.AudioEncoder.AAC, "aac");
-        audioEncoderMap.put(MediaRecorder.AudioEncoder.AAC_PLUS, "aacplus");
-        audioEncoderMap.put(MediaRecorder.AudioEncoder.EAAC_PLUS, "eaacplus");
+        audioEncoderMap.put(MediaRecorder.AudioEncoder.HE_AAC, "heaac");
     }
 }
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 01ddf1f..885389f 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1765,8 +1765,7 @@
                 Bundle arguments) {
             return canRetrieveWindowContent(service)
                 && isRetrievalAllowingWindow(windowId)
-                && isActionPermitted(action)
-                && isActionArgumentsValid(action, arguments);
+                && isActionPermitted(action);
         }
 
         public boolean canRetrieveWindowContent(Service service) {
@@ -1790,29 +1789,6 @@
              return (VALID_ACTIONS & action) != 0;
         }
 
-        private boolean isActionArgumentsValid(int action, Bundle arguments) {
-            switch (action) {
-                case AccessibilityNodeInfo.ACTION_NEXT_AT_GRANULARITY:
-                case AccessibilityNodeInfo.ACTION_PREVIOUS_AT_GRANULARITY: {
-                    if (arguments.size() == 1) {
-                        final int granularity = arguments.getInt(
-                                AccessibilityNodeInfo.ACTION_ARGUMENT_GRANULARITY_INT);
-                        return (granularity & VALID_GRANULARITIES) != 0
-                                && Integer.bitCount(granularity) == 1;
-                    }
-                } break;
-                case AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT:
-                case AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT: {
-                    if (arguments.size() == 1) {
-                        String element = arguments.getString(
-                                AccessibilityNodeInfo.ACTION_ARGUMENT_HTML_ELEMENT_STRING);
-                        return !TextUtils.isEmpty(element);
-                    }
-                } break;
-            }
-            return false;
-        }
-
         private void enforceCallingPermission(String permission, String function) {
             if (OWN_PROCESS_ID == Binder.getCallingPid()) {
                 return;
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
index 55f2ca3..97a8755 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -1139,6 +1139,14 @@
                 mUserDataEnabled = enabled;
                 Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
                         Settings.Secure.MOBILE_DATA, enabled ? 1 : 0);
+                if (getDataOnRoamingEnabled() == false &&
+                        mPhone.getServiceState().getRoaming() == true) {
+                    if (enabled) {
+                        notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
+                    } else {
+                        notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED);
+                    }
+                }
                 if (prevEnabled != getAnyDataEnabled()) {
                     if (!prevEnabled) {
                         resetAllRetryCounts();
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 7e5e707..a691eae 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -629,6 +629,8 @@
      */
     @Override
     protected void onRoamingOff() {
+        if (mUserDataEnabled == false) return;
+
         if (getDataOnRoamingEnabled() == false) {
             notifyOffApnsOfAvailability(Phone.REASON_ROAMING_OFF);
             trySetupData(Phone.REASON_ROAMING_OFF);
@@ -642,6 +644,8 @@
      */
     @Override
     protected void onRoamingOn() {
+        if (mUserDataEnabled == false) return;
+
         if (getDataOnRoamingEnabled()) {
             trySetupData(Phone.REASON_ROAMING_ON);
             notifyDataConnection(Phone.REASON_ROAMING_ON);
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 56dbfb8..bfdb706 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -1863,6 +1863,8 @@
     protected void onRoamingOff() {
         if (DBG) log("onRoamingOff");
 
+        if (mUserDataEnabled == false) return;
+
         if (getDataOnRoamingEnabled() == false) {
             notifyOffApnsOfAvailability(Phone.REASON_ROAMING_OFF);
             setupDataOnReadyApns(Phone.REASON_ROAMING_OFF);
@@ -1873,6 +1875,8 @@
 
     @Override
     protected void onRoamingOn() {
+        if (mUserDataEnabled == false) return;
+
         if (getDataOnRoamingEnabled()) {
             if (DBG) log("onRoamingOn: setup data on roaming");
             setupDataOnReadyApns(Phone.REASON_ROAMING_ON);