diff --git a/Android.mk b/Android.mk
index f45f977..d684cd3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -78,8 +78,9 @@
 	core/java/android/app/IThumbnailReceiver.aidl \
 	core/java/android/app/IThumbnailRetriever.aidl \
 	core/java/android/app/ITransientNotification.aidl \
+	core/java/android/app/IUiAutomationConnection.aidl \
 	core/java/android/app/IUiModeManager.aidl \
-    core/java/android/app/IUserSwitchObserver.aidl \
+	core/java/android/app/IUserSwitchObserver.aidl \
 	core/java/android/app/IWallpaperManager.aidl \
 	core/java/android/app/IWallpaperManagerCallback.aidl \
 	core/java/android/app/admin/IDevicePolicyManager.aidl \
@@ -219,10 +220,7 @@
 	telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl \
 	telephony/java/com/android/internal/telephony/IWapPushManager.aidl \
 	wifi/java/android/net/wifi/IWifiManager.aidl \
-	wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl \
-	voip/java/android/net/sip/ISipSession.aidl \
-	voip/java/android/net/sip/ISipSessionListener.aidl \
-	voip/java/android/net/sip/ISipService.aidl
+	wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl
 #
 
 
@@ -353,6 +351,8 @@
 	../../external/apache-http/src/org/apache/http \
 	../opt/telephony/src/java/android/telephony \
 	../opt/telephony/src/java/android/telephony/gsm \
+	../opt/net/voip/src/java/android/net/rtp \
+	../opt/net/voip/src/java/android/net/sip
 
 # These are relative to frameworks/base
 dirs_to_check_apis := \
@@ -405,6 +405,7 @@
 			framework \
 			mms-common \
 			telephony-common \
+			voip-common \
 
 framework_docs_LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 framework_docs_LOCAL_DROIDDOC_HTML_DIR := docs/html
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 06f7c54..2c7d16f 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -149,6 +149,11 @@
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/view/IDisplayMagnificationController.P)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/view/IDisplayMagnificationMediator.java)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/view/IDisplayMagnificationMediator.P)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/voip)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/librtp_jni_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/librtp_jni.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/lib/librtp_jni.so)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/symbols/system/lib/librtp_jni.so)
 
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
diff --git a/api/current.txt b/api/current.txt
index d367a00..9cd44ed 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -57,6 +57,7 @@
     field public static final java.lang.String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
     field public static final java.lang.String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
     field public static final java.lang.String GET_TASKS = "android.permission.GET_TASKS";
+    field public static final java.lang.String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO";
     field public static final java.lang.String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH";
     field public static final java.lang.String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
     field public static final java.lang.String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
@@ -2103,6 +2104,7 @@
     field public static final int FEEDBACK_SPOKEN = 1; // 0x1
     field public static final int FEEDBACK_VISUAL = 8; // 0x8
     field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 8; // 0x8
     field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
     field public int eventTypes;
     field public int feedbackType;
@@ -2738,6 +2740,7 @@
     method public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder);
     method public boolean onPrepareOptionsMenu(android.view.Menu);
     method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
+    method public void onProvideAssistData(android.os.Bundle);
     method protected void onRestart();
     method protected void onRestoreInstanceState(android.os.Bundle);
     method protected void onResume();
@@ -3077,7 +3080,9 @@
     method public void onTerminate();
     method public void onTrimMemory(int);
     method public void registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
+    method public void registerOnProvideAssistData(android.app.Application.OnProvideAssistData);
     method public void unregisterActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks);
+    method public void unregisterOnProvideAssistData(android.app.Application.OnProvideAssistData);
   }
 
   public static abstract interface Application.ActivityLifecycleCallbacks {
@@ -3090,6 +3095,10 @@
     method public abstract void onActivityStopped(android.app.Activity);
   }
 
+  public static abstract interface Application.OnProvideAssistData {
+    method public abstract void onProvideAssistData(android.app.Activity, android.os.Bundle);
+  }
+
   public class ApplicationErrorReport implements android.os.Parcelable {
     ctor public ApplicationErrorReport();
     method public int describeContents();
@@ -3579,6 +3588,7 @@
     method public android.content.ComponentName getComponentName();
     method public android.content.Context getContext();
     method public android.content.Context getTargetContext();
+    method public android.app.UiAutomation getUiAutomation();
     method public boolean invokeContextMenuAction(android.app.Activity, int, int);
     method public boolean invokeMenuActionSync(android.app.Activity, int, int);
     method public boolean isProfiling();
@@ -4136,6 +4146,26 @@
     method public abstract void onTimeSet(android.widget.TimePicker, int, int);
   }
 
+  public final class UiAutomation {
+    method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, com.android.internal.util.Predicate<android.view.accessibility.AccessibilityEvent>, long) throws java.util.concurrent.TimeoutException;
+    method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
+    method public boolean injectInputEvent(android.view.InputEvent, boolean);
+    method public void setOnAccessibilityEventListener(android.app.UiAutomation.OnAccessibilityEventListener);
+    method public boolean setRotation(int);
+    method public android.graphics.Bitmap takeScreenshot();
+    method public void waitForIdle(long, long) throws java.util.concurrent.TimeoutException;
+    field public static final int ROTATION_FREEZE_0 = 0; // 0x0
+    field public static final int ROTATION_FREEZE_180 = 2; // 0x2
+    field public static final int ROTATION_FREEZE_270 = 3; // 0x3
+    field public static final int ROTATION_FREEZE_90 = 1; // 0x1
+    field public static final int ROTATION_FREEZE_CURRENT = -1; // 0xffffffff
+    field public static final int ROTATION_UNFREEZE = -2; // 0xfffffffe
+  }
+
+  public static abstract interface UiAutomation.OnAccessibilityEventListener {
+    method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+  }
+
   public class UiModeManager {
     method public void disableCarMode(int);
     method public void enableCarMode(int);
@@ -5114,6 +5144,7 @@
     method public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
     method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
     method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
     method public final android.content.Context getContext();
     method public final android.content.pm.PathPermission[] getPathPermissions();
     method public final java.lang.String getReadPermission();
@@ -5900,7 +5931,10 @@
     field public static final java.lang.String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
     field public static final android.os.Parcelable.Creator CREATOR;
     field public static final java.lang.String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
+    field public static final java.lang.String EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE";
     field public static final deprecated java.lang.String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
+    field public static final java.lang.String EXTRA_ASSIST_CONTEXT = "android.intent.extra.ASSIST_CONTEXT";
+    field public static final java.lang.String EXTRA_ASSIST_PACKAGE = "android.intent.extra.ASSIST_PACKAGE";
     field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
     field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
     field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
@@ -6627,6 +6661,7 @@
     method public abstract void verifyPendingInstall(int, int);
     field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
     field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
+    field public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4; // 0x4
     field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
     field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
     field public static final int DONT_KILL_APP = 1; // 0x1
@@ -6673,6 +6708,7 @@
     field public static final int GET_ACTIVITIES = 1; // 0x1
     field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
     field public static final int GET_DISABLED_COMPONENTS = 512; // 0x200
+    field public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 32768; // 0x8000
     field public static final int GET_GIDS = 256; // 0x100
     field public static final int GET_INSTRUMENTATION = 16; // 0x10
     field public static final int GET_INTENT_FILTERS = 32; // 0x20
@@ -10688,6 +10724,7 @@
     method public boolean hasAltitude();
     method public boolean hasBearing();
     method public boolean hasSpeed();
+    method public boolean isFromMockProvider();
     method public void removeAccuracy();
     method public void removeAltitude();
     method public void removeBearing();
@@ -20617,21 +20654,23 @@
   public class TextToSpeech.Engine {
     ctor public TextToSpeech.Engine();
     field public static final java.lang.String ACTION_CHECK_TTS_DATA = "android.speech.tts.engine.CHECK_TTS_DATA";
+    field public static final java.lang.String ACTION_GET_SAMPLE_TEXT = "android.speech.tts.engine.GET_SAMPLE_TEXT";
     field public static final java.lang.String ACTION_INSTALL_TTS_DATA = "android.speech.tts.engine.INSTALL_TTS_DATA";
     field public static final java.lang.String ACTION_TTS_DATA_INSTALLED = "android.speech.tts.engine.TTS_DATA_INSTALLED";
-    field public static final int CHECK_VOICE_DATA_BAD_DATA = -1; // 0xffffffff
+    field public static final deprecated int CHECK_VOICE_DATA_BAD_DATA = -1; // 0xffffffff
     field public static final int CHECK_VOICE_DATA_FAIL = 0; // 0x0
-    field public static final int CHECK_VOICE_DATA_MISSING_DATA = -2; // 0xfffffffe
-    field public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3; // 0xfffffffd
+    field public static final deprecated int CHECK_VOICE_DATA_MISSING_DATA = -2; // 0xfffffffe
+    field public static final deprecated int CHECK_VOICE_DATA_MISSING_VOLUME = -3; // 0xfffffffd
     field public static final int CHECK_VOICE_DATA_PASS = 1; // 0x1
     field public static final int DEFAULT_STREAM = 3; // 0x3
     field public static final java.lang.String EXTRA_AVAILABLE_VOICES = "availableVoices";
-    field public static final java.lang.String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor";
-    field public static final java.lang.String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
+    field public static final deprecated java.lang.String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor";
+    field public static final java.lang.String EXTRA_SAMPLE_TEXT = "sampleText";
+    field public static final deprecated java.lang.String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
     field public static final java.lang.String EXTRA_UNAVAILABLE_VOICES = "unavailableVoices";
-    field public static final java.lang.String EXTRA_VOICE_DATA_FILES = "dataFiles";
-    field public static final java.lang.String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
-    field public static final java.lang.String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
+    field public static final deprecated java.lang.String EXTRA_VOICE_DATA_FILES = "dataFiles";
+    field public static final deprecated java.lang.String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
+    field public static final deprecated java.lang.String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
     field public static final java.lang.String INTENT_ACTION_TTS_SERVICE = "android.intent.action.TTS_SERVICE";
     field public static final java.lang.String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts";
     field public static final java.lang.String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts";
@@ -20653,7 +20692,7 @@
     method public abstract void onInit(int);
   }
 
-  public static abstract interface TextToSpeech.OnUtteranceCompletedListener {
+  public static abstract deprecated interface TextToSpeech.OnUtteranceCompletedListener {
     method public abstract void onUtteranceCompleted(java.lang.String);
   }
 
@@ -21294,6 +21333,7 @@
     ctor public InstrumentationTestRunner();
     method public junit.framework.TestSuite getAllTests();
     method protected android.test.AndroidTestRunner getAndroidTestRunner();
+    method public android.os.Bundle getArguments();
     method public java.lang.ClassLoader getLoader();
     method public junit.framework.TestSuite getTestSuite();
     field public static final java.lang.String REPORT_KEY_NAME_CLASS = "class";
@@ -26240,6 +26280,7 @@
     method public void addChild(android.view.View, int);
     method public int describeContents();
     method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String);
+    method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(java.lang.String);
     method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
     method public android.view.accessibility.AccessibilityNodeInfo focusSearch(int);
     method public int getActions();
@@ -26255,6 +26296,7 @@
     method public java.lang.CharSequence getPackageName();
     method public android.view.accessibility.AccessibilityNodeInfo getParent();
     method public java.lang.CharSequence getText();
+    method public java.lang.CharSequence getViewId();
     method public int getWindowId();
     method public boolean isAccessibilityFocused();
     method public boolean isCheckable();
@@ -26302,6 +26344,7 @@
     method public void setSource(android.view.View);
     method public void setSource(android.view.View, int);
     method public void setText(java.lang.CharSequence);
+    method public void setViewId(java.lang.CharSequence);
     method public void setVisibleToUser(boolean);
     method public void writeToParcel(android.os.Parcel, int);
     field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index add7a23..b5574cf 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -24,6 +24,7 @@
 import android.app.IActivityManager;
 import android.app.IInstrumentationWatcher;
 import android.app.Instrumentation;
+import android.app.UiAutomationConnection;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.IIntentReceiver;
@@ -661,10 +662,13 @@
         if (cn == null) throw new IllegalArgumentException("Bad component name: " + cnArg);
 
         InstrumentationWatcher watcher = null;
+        UiAutomationConnection connection = null;
         if (wait) {
             watcher = new InstrumentationWatcher();
             watcher.setRawOutput(rawMode);
+            connection = new UiAutomationConnection();
         }
+
         float[] oldAnims = null;
         if (no_window_animation) {
             oldAnims = wm.getAnimationScales();
@@ -672,7 +676,7 @@
             wm.setAnimationScale(1, 0.0f);
         }
 
-        if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, userId)) {
+        if (!mAm.startInstrumentation(cn, profileFile, 0, args, watcher, connection, userId)) {
             throw new AndroidException("INSTRUMENTATION_FAILED: " + cn.flattenToString());
         }
 
diff --git a/cmds/content/src/com/android/commands/content/Content.java b/cmds/content/src/com/android/commands/content/Content.java
index 2ae2071..c0a1e3b 100644
--- a/cmds/content/src/com/android/commands/content/Content.java
+++ b/cmds/content/src/com/android/commands/content/Content.java
@@ -24,6 +24,7 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.IBinder;
 import android.os.UserHandle;
 import android.text.TextUtils;
@@ -102,6 +103,12 @@
                 + "equal to \"new_setting\" and sort the result by name in ascending order.\n"
         + "  adb shell content query --uri content://settings/secure --projection name:value"
                 + " --where \"name=\'new_setting\'\" --sort \"name ASC\"\n"
+        + "\n"
+        + "usage: adb shell content call --uri <URI> --method <METHOD> [--arg <ARG>]\n"
+        + "       [--extra <BINDING> ...]\n"
+        + "  <METHOD> is the name of a provider-defined method\n"
+        + "  <ARG> is an optional string argument\n"
+        + "  <BINDING> is like --bind above, typed data of the form <KEY>:{b,s,i,l,f,d}:<VAL>\n"
         + "\n";
 
     private static class Parser {
@@ -109,12 +116,16 @@
         private static final String ARGUMENT_DELETE = "delete";
         private static final String ARGUMENT_UPDATE = "update";
         private static final String ARGUMENT_QUERY = "query";
+        private static final String ARGUMENT_CALL = "call";
         private static final String ARGUMENT_WHERE = "--where";
         private static final String ARGUMENT_BIND = "--bind";
         private static final String ARGUMENT_URI = "--uri";
         private static final String ARGUMENT_USER = "--user";
         private static final String ARGUMENT_PROJECTION = "--projection";
         private static final String ARGUMENT_SORT = "--sort";
+        private static final String ARGUMENT_METHOD = "--method";
+        private static final String ARGUMENT_ARG = "--arg";
+        private static final String ARGUMENT_EXTRA = "--extra";
         private static final String TYPE_BOOLEAN = "b";
         private static final String TYPE_STRING = "s";
         private static final String TYPE_INTEGER = "i";
@@ -141,6 +152,8 @@
                     return parseUpdateCommand();
                 } else if (ARGUMENT_QUERY.equals(operation)) {
                     return parseQueryCommand();
+                } else if (ARGUMENT_CALL.equals(operation)) {
+                    return parseCallCommand();
                 } else {
                     throw new IllegalArgumentException("Unsupported operation: " + operation);
                 }
@@ -228,6 +241,38 @@
             return new UpdateCommand(uri, userId, values, where);
         }
 
+        public CallCommand parseCallCommand() {
+            String method = null;
+            int userId = UserHandle.USER_OWNER;
+            String arg = null;
+            Uri uri = null;
+            ContentValues values = new ContentValues();
+            for (String argument; (argument = mTokenizer.nextArg())!= null;) {
+                if (ARGUMENT_URI.equals(argument)) {
+                    uri = Uri.parse(argumentValueRequired(argument));
+                } else if (ARGUMENT_USER.equals(argument)) {
+                    userId = Integer.parseInt(argumentValueRequired(argument));
+                } else if (ARGUMENT_METHOD.equals(argument)) {
+                    method = argumentValueRequired(argument);
+                } else if (ARGUMENT_ARG.equals(argument)) {
+                    arg = argumentValueRequired(argument);
+                } else if (ARGUMENT_EXTRA.equals(argument)) {
+                    parseBindValue(values);
+                } else {
+                    throw new IllegalArgumentException("Unsupported argument: " + argument);
+                }
+
+            }
+            if (uri == null) {
+                throw new IllegalArgumentException("Content provider URI not specified."
+                        + " Did you specify --uri argument?");
+            }
+            if (method == null) {
+                throw new IllegalArgumentException("Content provider method not specified.");
+            }
+            return new CallCommand(uri, userId, method, arg, values);
+        }
+
         public QueryCommand parseQueryCommand() {
             Uri uri = null;
             int userId = UserHandle.USER_OWNER;
@@ -376,6 +421,43 @@
         }
     }
 
+    private static class CallCommand extends Command {
+        final String mMethod, mArg;
+        Bundle mExtras = null;
+
+        public CallCommand(Uri uri, int userId, String method, String arg, ContentValues values) {
+            super(uri, userId);
+            mMethod = method;
+            mArg = arg;
+            if (values != null) {
+                mExtras = new Bundle();
+                for (String key : values.keySet()) {
+                    final Object val = values.get(key);
+                    if (val instanceof String) {
+                        mExtras.putString(key, (String) val);
+                    } else if (val instanceof Float) {
+                        mExtras.putFloat(key, (Float) val);
+                    } else if (val instanceof Double) {
+                        mExtras.putDouble(key, (Double) val);
+                    } else if (val instanceof Boolean) {
+                        mExtras.putBoolean(key, (Boolean) val);
+                    } else if (val instanceof Integer) {
+                        mExtras.putInt(key, (Integer) val);
+                    } else if (val instanceof Long) {
+                        mExtras.putLong(key, (Long) val);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onExecute(IContentProvider provider) throws Exception {
+            Bundle result = provider.call(null, mMethod, mArg, mExtras);
+            final int size = result.size(); // unpack
+            System.out.println("Result: " + result);
+        }
+    }
+
     private static class QueryCommand extends DeleteCommand {
         final String[] mProjection;
         final String mSortOrder;
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 39539b4..f0e3370 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -135,6 +135,11 @@
             return;
         }
 
+        if ("disable-until-used".equals(op)) {
+            runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
+            return;
+        }
+
         if ("grant".equals(op)) {
             runGrantRevokePermission(true);
             return;
@@ -1178,6 +1183,8 @@
                 return "disabled";
             case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER:
                 return "disabled-user";
+            case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
+                return "disabled-until-used";
         }
         return "unknown";
     }
@@ -1459,6 +1466,7 @@
         System.err.println("       pm enable [--user USER_ID] PACKAGE_OR_COMPONENT");
         System.err.println("       pm disable [--user USER_ID] PACKAGE_OR_COMPONENT");
         System.err.println("       pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT");
+        System.err.println("       pm disable-until-used [--user USER_ID] PACKAGE_OR_COMPONENT");
         System.err.println("       pm grant PACKAGE PERMISSION");
         System.err.println("       pm revoke PACKAGE PERMISSION");
         System.err.println("       pm set-install-location [0/auto] [1/internal] [2/external]");
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 7efe189..8dddbc1 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -339,7 +339,10 @@
 
     private static final String LOG_TAG = "AccessibilityService";
 
-    interface Callbacks {
+    /**
+     * @hide
+     */
+    public interface Callbacks {
         public void onAccessibilityEvent(AccessibilityEvent event);
         public void onInterrupt();
         public void onServiceConnected();
@@ -538,8 +541,10 @@
     /**
      * Implements the internal {@link IAccessibilityServiceClient} interface to convert
      * incoming calls to it back to calls on an {@link AccessibilityService}.
+     *
+     * @hide
      */
-    static class IAccessibilityServiceClientWrapper extends IAccessibilityServiceClient.Stub
+    public static class IAccessibilityServiceClientWrapper extends IAccessibilityServiceClient.Stub
             implements HandlerCaller.Callback {
 
         static final int NO_ID = -1;
@@ -610,6 +615,7 @@
                         mCallback.onServiceConnected();
                     } else {
                         AccessibilityInteractionClient.getInstance().removeConnection(connectionId);
+                        AccessibilityInteractionClient.getInstance().clearCache();
                         mCallback.onSetConnectionId(AccessibilityInteractionClient.NO_ID);
                     }
                     return;
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 75a4f83..2006bc7 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -33,6 +33,7 @@
 import android.util.Xml;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -152,6 +153,15 @@
     public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE= 0x0000004;
 
     /**
+     * This flag requests that the {@link AccessibilityNodeInfo}s obtained
+     * by an {@link AccessibilityService} contain the id of the source view.
+     * The source view id will be a fully qualified resource name of the
+     * form "package:id/name", for example "foo.bar:id/my_list", and it is
+     * useful for UI test automation. This flag is not set by default.
+     */
+    public static final int FLAG_REPORT_VIEW_IDS = 0x00000008;
+
+    /**
      * The event types an {@link AccessibilityService} is interested in.
      * <p>
      *   <strong>Can be dynamically set at runtime.</strong>
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
index f33f503..7a29f35 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl
@@ -85,15 +85,15 @@
      *     where to start the search. Use
      *     {@link android.view.accessibility.AccessibilityNodeInfo#ROOT_NODE_ID}
      *     to start from the root.
-     * @param id The id of the node.
+     * @param viewId The fully qualified resource name of the view id to find.
      * @param interactionId The id of the interaction for matching with the callback result.
      * @param callback Callback which to receive the result.
      * @param threadId The id of the calling thread.
      * @return Whether the call succeeded.
      */
-    boolean findAccessibilityNodeInfoByViewId(int accessibilityWindowId, long accessibilityNodeId,
-        int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback,
-        long threadId);
+    boolean findAccessibilityNodeInfosByViewId(int accessibilityWindowId,
+        long accessibilityNodeId, String viewId, int interactionId,
+        IAccessibilityInteractionConnectionCallback callback, long threadId);
 
     /**
      * Finds the {@link android.view.accessibility.AccessibilityNodeInfo} that has the specified
diff --git a/core/java/android/accessibilityservice/UiTestAutomationBridge.java b/core/java/android/accessibilityservice/UiTestAutomationBridge.java
deleted file mode 100644
index 6837386..0000000
--- a/core/java/android/accessibilityservice/UiTestAutomationBridge.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * Copyright (C) 2012 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.accessibilityservice;
-
-import android.accessibilityservice.AccessibilityService.Callbacks;
-import android.accessibilityservice.AccessibilityService.IAccessibilityServiceClientWrapper;
-import android.content.Context;
-import android.os.Bundle;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityInteractionClient;
-import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.accessibility.IAccessibilityManager;
-
-import com.android.internal.util.Predicate;
-
-import java.util.List;
-import java.util.concurrent.TimeoutException;
-
-/**
- * This class represents a bridge that can be used for UI test
- * automation. It is responsible for connecting to the system,
- * keeping track of the last accessibility event, and exposing
- * window content querying APIs. This class is designed to be
- * used from both an Android application and a Java program
- * run from the shell.
- *
- * @hide
- */
-public class UiTestAutomationBridge {
-
-    private static final String LOG_TAG = UiTestAutomationBridge.class.getSimpleName();
-
-    private static final int TIMEOUT_REGISTER_SERVICE = 5000;
-
-    public static final int ACTIVE_WINDOW_ID = AccessibilityNodeInfo.ACTIVE_WINDOW_ID;
-
-    public static final long ROOT_NODE_ID = AccessibilityNodeInfo.ROOT_NODE_ID;
-
-    public static final int UNDEFINED = -1;
-
-    private static final int FIND_ACCESSIBILITY_NODE_INFO_PREFETCH_FLAGS =
-        AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS
-        | AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS
-        | AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS;
-
-    private final Object mLock = new Object();
-
-    private volatile int mConnectionId = AccessibilityInteractionClient.NO_ID;
-
-    private IAccessibilityServiceClientWrapper mListener;
-
-    private AccessibilityEvent mLastEvent;
-
-    private volatile boolean mWaitingForEventDelivery;
-
-    private volatile boolean mUnprocessedEventAvailable;
-
-    private HandlerThread mHandlerThread;
-
-    /**
-     * Gets the last received {@link AccessibilityEvent}.
-     *
-     * @return The event.
-     */
-    public AccessibilityEvent getLastAccessibilityEvent() {
-        return mLastEvent;
-    }
-
-    /**
-     * Callback for receiving an {@link AccessibilityEvent}.
-     *
-     * <strong>Note:</strong> This method is <strong>NOT</strong>
-     * executed on the application main thread. The client are
-     * responsible for proper synchronization.
-     *
-     * @param event The received event.
-     */
-    public void onAccessibilityEvent(AccessibilityEvent event) {
-        /* hook - do nothing */
-    }
-
-    /**
-     * Callback for requests to stop feedback.
-     *
-     * <strong>Note:</strong> This method is <strong>NOT</strong>
-     * executed on the application main thread. The client are
-     * responsible for proper synchronization.
-     */
-    public void onInterrupt() {
-        /* hook - do nothing */
-    }
-
-    /**
-     * Connects this service.
-     *
-     * @throws IllegalStateException If already connected.
-     */
-    public void connect() {
-        if (isConnected()) {
-            throw new IllegalStateException("Already connected.");
-        }
-
-        // Serialize binder calls to a handler on a dedicated thread
-        // different from the main since we expose APIs that block
-        // the main thread waiting for a result the deliver of which
-        // on the main thread will prevent that thread from waking up.
-        // The serialization is needed also to ensure that events are
-        // examined in delivery order. Otherwise, a fair locking
-        // is needed for making sure the binder calls are interleaved
-        // with check for the expected event and also to make sure the
-        // binder threads are allowed to proceed in the received order.
-        mHandlerThread = new HandlerThread("UiTestAutomationBridge");
-        mHandlerThread.setDaemon(true);
-        mHandlerThread.start();
-        Looper looper = mHandlerThread.getLooper();
-
-        mListener = new IAccessibilityServiceClientWrapper(null, looper, new Callbacks() {
-            @Override
-            public void onServiceConnected() {
-                /* do nothing */
-            }
-
-            @Override
-            public void onInterrupt() {
-                UiTestAutomationBridge.this.onInterrupt();
-            }
-
-            @Override
-            public void onAccessibilityEvent(AccessibilityEvent event) {
-                synchronized (mLock) {
-                    while (true) {
-                        mLastEvent = AccessibilityEvent.obtain(event);
-                        if (!mWaitingForEventDelivery) {
-                            mLock.notifyAll();
-                            break;
-                        }
-                        if (!mUnprocessedEventAvailable) {
-                            mUnprocessedEventAvailable = true;
-                            mLock.notifyAll();
-                            break;
-                        }
-                        try {
-                            mLock.wait();
-                        } catch (InterruptedException ie) {
-                            /* ignore */
-                        }
-                    }
-                }
-                UiTestAutomationBridge.this.onAccessibilityEvent(event);
-            }
-
-            @Override
-            public void onSetConnectionId(int connectionId) {
-                synchronized (mLock) {
-                    mConnectionId = connectionId;
-                    mLock.notifyAll();
-                }
-            }
-
-            @Override
-            public boolean onGesture(int gestureId) {
-                return false;
-            }
-        });
-
-        final IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
-                ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
-
-        final AccessibilityServiceInfo info = new AccessibilityServiceInfo();
-        info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
-        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
-        info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
-
-        try {
-            manager.registerUiTestAutomationService(mListener, info);
-        } catch (RemoteException re) {
-            throw new IllegalStateException("Cound not register UiAutomationService.", re);
-        }
-
-        synchronized (mLock) {
-            final long startTimeMillis = SystemClock.uptimeMillis();
-            while (true) {
-                if (isConnected()) {
-                    return;
-                }
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                final long remainingTimeMillis = TIMEOUT_REGISTER_SERVICE - elapsedTimeMillis;
-                if (remainingTimeMillis <= 0) {
-                    throw new IllegalStateException("Cound not register UiAutomationService.");
-                }
-                try {
-                    mLock.wait(remainingTimeMillis);
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-            }
-        }
-    }
-
-    /**
-     * Disconnects this service.
-     *
-     * @throws IllegalStateException If already disconnected.
-     */
-    public void disconnect() {
-        if (!isConnected()) {
-            throw new IllegalStateException("Already disconnected.");
-        }
-
-        mHandlerThread.quit();
-
-        IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
-              ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
-
-        try {
-            manager.unregisterUiTestAutomationService(mListener);
-        } catch (RemoteException re) {
-            Log.e(LOG_TAG, "Error while unregistering UiTestAutomationService", re);
-        }
-    }
-
-    /**
-     * Gets whether this service is connected.
-     *
-     * @return True if connected.
-     */
-    public boolean isConnected() {
-        return (mConnectionId != AccessibilityInteractionClient.NO_ID);
-    }
-
-    /**
-     * Executes a command and waits for a specific accessibility event type up
-     * to a given timeout.
-     *
-     * @param command The command to execute before starting to wait for the event.
-     * @param predicate Predicate for recognizing the awaited event.
-     * @param timeoutMillis The max wait time in milliseconds.
-     */
-    public AccessibilityEvent executeCommandAndWaitForAccessibilityEvent(Runnable command,
-            Predicate<AccessibilityEvent> predicate, long timeoutMillis)
-            throws TimeoutException, Exception {
-        // TODO: This is broken - remove from here when finalizing this as public APIs.
-        synchronized (mLock) {
-            // Prepare to wait for an event.
-            mWaitingForEventDelivery = true;
-            mUnprocessedEventAvailable = false;
-            if (mLastEvent != null) {
-                mLastEvent.recycle();
-                mLastEvent = null;
-            }
-            // Execute the command.
-            command.run();
-            // Wait for the event.
-            final long startTimeMillis = SystemClock.uptimeMillis();
-            while (true) {
-                // If the expected event is received, that's it.
-                if ((mUnprocessedEventAvailable && predicate.apply(mLastEvent))) {
-                    mWaitingForEventDelivery = false;
-                    mUnprocessedEventAvailable = false;
-                    mLock.notifyAll();
-                    return mLastEvent;
-                }
-                // Ask for another event.
-                mWaitingForEventDelivery = true;
-                mUnprocessedEventAvailable = false;
-                mLock.notifyAll();
-                // Check if timed out and if not wait.
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis;
-                if (remainingTimeMillis <= 0) {
-                    mWaitingForEventDelivery = false;
-                    mUnprocessedEventAvailable = false;
-                    mLock.notifyAll();
-                    throw new TimeoutException("Expacted event not received within: "
-                            + timeoutMillis + " ms.");
-                }
-                try {
-                    mLock.wait(remainingTimeMillis);
-                } catch (InterruptedException ie) {
-                    /* ignore */
-                }
-            }
-        }
-    }
-
-    /**
-     * Waits for the accessibility event stream to become idle, which is not to
-     * have received a new accessibility event within <code>idleTimeout</code>,
-     * and do so within a maximal global timeout as specified by
-     * <code>globalTimeout</code>.
-     *
-     * @param idleTimeout The timeout between two event to consider the device idle.
-     * @param globalTimeout The maximal global timeout in which to wait for idle.
-     */
-    public void waitForIdle(long idleTimeout, long globalTimeout) {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        long lastEventTime = (mLastEvent != null)
-                ? mLastEvent.getEventTime() : SystemClock.uptimeMillis();
-        synchronized (mLock) {
-            while (true) {
-                final long currentTimeMillis = SystemClock.uptimeMillis();
-                final long sinceLastEventTimeMillis = currentTimeMillis - lastEventTime;
-                if (sinceLastEventTimeMillis > idleTimeout) {
-                    return;
-                }
-                if (mLastEvent != null) {
-                    lastEventTime = mLastEvent.getEventTime();
-                }
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                final long remainingTimeMillis = globalTimeout - elapsedTimeMillis;
-                if (remainingTimeMillis <= 0) {
-                    return;
-                }
-                try {
-                     mLock.wait(idleTimeout);
-                } catch (InterruptedException e) {
-                     /* ignore */
-                }
-            }
-        }
-    }
-
-    /**
-     * Finds an {@link AccessibilityNodeInfo} by accessibility id in the active
-     * window. The search is performed from the root node.
-     *
-     * @param accessibilityNodeId A unique view id or virtual descendant id for
-     *     which to search.
-     * @return The current window scale, where zero means a failure.
-     */
-    public AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityIdInActiveWindow(
-            long accessibilityNodeId) {
-        return findAccessibilityNodeInfoByAccessibilityId(ACTIVE_WINDOW_ID, accessibilityNodeId);
-    }
-
-    /**
-     * Finds an {@link AccessibilityNodeInfo} by accessibility id.
-     *
-     * @param accessibilityWindowId A unique window id. Use {@link #ACTIVE_WINDOW_ID} to query
-     *     the currently active window.
-     * @param accessibilityNodeId A unique view id or virtual descendant id for
-     *     which to search.
-     * @return The current window scale, where zero means a failure.
-     */
-    public AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId(
-            int accessibilityWindowId, long accessibilityNodeId) {
-        // Cache the id to avoid locking
-        final int connectionId = mConnectionId;
-        ensureValidConnection(connectionId);
-        return AccessibilityInteractionClient.getInstance()
-                .findAccessibilityNodeInfoByAccessibilityId(mConnectionId,
-                        accessibilityWindowId, accessibilityNodeId,
-                        FIND_ACCESSIBILITY_NODE_INFO_PREFETCH_FLAGS);
-    }
-
-    /**
-     * Finds an {@link AccessibilityNodeInfo} by View id in the active
-     * window. The search is performed from the root node.
-     *
-     * @param viewId The id of a View.
-     * @return The current window scale, where zero means a failure.
-     */
-    public AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId) {
-        return findAccessibilityNodeInfoByViewId(ACTIVE_WINDOW_ID, ROOT_NODE_ID, viewId);
-    }
-
-    /**
-     * Finds an {@link AccessibilityNodeInfo} by View id. The search is performed in
-     * the window whose id is specified and starts from the node whose accessibility
-     * id is specified.
-     *
-     * @param accessibilityWindowId A unique window id. Use
-     *     {@link  #ACTIVE_WINDOW_ID} to query the currently active window.
-     * @param accessibilityNodeId A unique view id or virtual descendant id from
-     *     where to start the search. Use {@link  #ROOT_NODE_ID} to start from the root.
-     * @param viewId The id of a View.
-     * @return The current window scale, where zero means a failure.
-     */
-    public AccessibilityNodeInfo findAccessibilityNodeInfoByViewId(int accessibilityWindowId,
-            long accessibilityNodeId, int viewId) {
-        // Cache the id to avoid locking
-        final int connectionId = mConnectionId;
-        ensureValidConnection(connectionId);
-        return AccessibilityInteractionClient.getInstance()
-                .findAccessibilityNodeInfoByViewId(connectionId, accessibilityWindowId,
-                        accessibilityNodeId, viewId);
-    }
-
-    /**
-     * Finds {@link AccessibilityNodeInfo}s by View text in the active
-     * window. The search is performed from the root node.
-     *
-     * @param text The searched text.
-     * @return The current window scale, where zero means a failure.
-     */
-    public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByTextInActiveWindow(String text) {
-        return findAccessibilityNodeInfosByText(ACTIVE_WINDOW_ID, ROOT_NODE_ID, text);
-    }
-
-    /**
-     * Finds {@link AccessibilityNodeInfo}s by View text. The match is case
-     * insensitive containment. The search is performed in the window whose
-     * id is specified and starts from the node whose accessibility id is
-     * specified.
-     *
-     * @param accessibilityWindowId A unique window id. Use
-     *     {@link #ACTIVE_WINDOW_ID} to query the currently active window.
-     * @param accessibilityNodeId A unique view id or virtual descendant id from
-     *     where to start the search. Use {@link #ROOT_NODE_ID} to start from the root.
-     * @param text The searched text.
-     * @return The current window scale, where zero means a failure.
-     */
-    public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(int accessibilityWindowId,
-            long accessibilityNodeId, String text) {
-        // Cache the id to avoid locking
-        final int connectionId = mConnectionId;
-        ensureValidConnection(connectionId);
-        return AccessibilityInteractionClient.getInstance()
-                .findAccessibilityNodeInfosByText(connectionId, accessibilityWindowId,
-                        accessibilityNodeId, text);
-    }
-
-    /**
-     * Performs an accessibility action on an {@link AccessibilityNodeInfo}
-     * in the active window.
-     *
-     * @param accessibilityNodeId A unique node id (accessibility and virtual descendant id).
-     * @param action The action to perform.
-     * @param arguments Optional action arguments.
-     * @return Whether the action was performed.
-     */
-    public boolean performAccessibilityActionInActiveWindow(long accessibilityNodeId, int action,
-            Bundle arguments) {
-        return performAccessibilityAction(ACTIVE_WINDOW_ID, accessibilityNodeId, action, arguments);
-    }
-
-    /**
-     * Performs an accessibility action on an {@link AccessibilityNodeInfo}.
-     *
-     * @param accessibilityWindowId A unique window id. Use
-     *     {@link #ACTIVE_WINDOW_ID} to query the currently active window.
-     * @param accessibilityNodeId A unique node id (accessibility and virtual descendant id).
-     * @param action The action to perform.
-     * @param arguments Optional action arguments.
-     * @return Whether the action was performed.
-     */
-    public boolean performAccessibilityAction(int accessibilityWindowId, long accessibilityNodeId,
-            int action, Bundle arguments) {
-        // Cache the id to avoid locking
-        final int connectionId = mConnectionId;
-        ensureValidConnection(connectionId);
-        return AccessibilityInteractionClient.getInstance().performAccessibilityAction(connectionId,
-                accessibilityWindowId, accessibilityNodeId, action, arguments);
-    }
-
-    /**
-     * Gets the root {@link AccessibilityNodeInfo} in the active window.
-     *
-     * @return The root info.
-     */
-    public AccessibilityNodeInfo getRootAccessibilityNodeInfoInActiveWindow() {
-        // Cache the id to avoid locking
-        final int connectionId = mConnectionId;
-        ensureValidConnection(connectionId);
-        return AccessibilityInteractionClient.getInstance()
-                .findAccessibilityNodeInfoByAccessibilityId(connectionId, ACTIVE_WINDOW_ID,
-                        ROOT_NODE_ID, AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS);
-    }
-
-    private void ensureValidConnection(int connectionId) {
-        if (connectionId == UNDEFINED) {
-            throw new IllegalStateException("UiAutomationService not connected."
-                    + " Did you call #register()?");
-        }
-    }
-}
diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java
index 2337790..3602fc4 100644
--- a/core/java/android/app/ActionBar.java
+++ b/core/java/android/app/ActionBar.java
@@ -132,6 +132,12 @@
     public static final int DISPLAY_SHOW_CUSTOM = 0x10;
 
     /**
+     * Allow the title to wrap onto multiple lines if space is available
+     * @hide pending API approval
+     */
+    public static final int DISPLAY_TITLE_MULTIPLE_LINES = 0x20;
+
+    /**
      * Set the action bar into custom navigation mode, supplying a view
      * for custom navigation.
      *
@@ -680,6 +686,15 @@
     public Context getThemedContext() { return null; }
 
     /**
+     * Returns true if the Title field has been truncated during layout for lack
+     * of available space.
+     *
+     * @return true if the Title field has been truncated
+     * @hide pending API approval
+     */
+    public boolean isTitleTruncated() { return false; }
+
+    /**
      * Listener interface for ActionBar navigation events.
      */
     public interface OnNavigationListener {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index d6ddeb6..18ccd53 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1346,6 +1346,20 @@
     }
 
     /**
+     * This is called when the user is requesting an assist, to build a full
+     * {@link Intent#ACTION_ASSIST} Intent with all of the context of the current
+     * application.  You can override this method to place into the bundle anything
+     * you would like to appear in the {@link Intent#EXTRA_ASSIST_CONTEXT} part
+     * of the assist Intent.  The default implementation does nothing.
+     *
+     * <p>This function will be called after any global assist callbacks that had
+     * been registered with {@link Application#registerOnProvideAssistData
+     * Application.registerOnProvideAssistData}.
+     */
+    public void onProvideAssistData(Bundle data) {
+    }
+
+    /**
      * Called when you are no longer visible to the user.  You will next
      * receive either {@link #onRestart}, {@link #onDestroy}, or nothing,
      * depending on later user activity.
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 61b2067..d8e2239 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -39,7 +39,6 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.StrictMode;
-import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Singleton;
@@ -836,8 +835,10 @@
             Bundle arguments = data.readBundle();
             IBinder b = data.readStrongBinder();
             IInstrumentationWatcher w = IInstrumentationWatcher.Stub.asInterface(b);
+            b = data.readStrongBinder();
+            IUiAutomationConnection c = IUiAutomationConnection.Stub.asInterface(b);
             int userId = data.readInt();
-            boolean res = startInstrumentation(className, profileFile, fl, arguments, w, userId);
+            boolean res = startInstrumentation(className, profileFile, fl, arguments, w, c, userId);
             reply.writeNoException();
             reply.writeInt(res ? 1 : 0);
             return true;
@@ -1818,6 +1819,24 @@
             return true;
         }
 
+        case GET_TOP_ACTIVITY_EXTRAS_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            int requestType = data.readInt();
+            Bundle res = getTopActivityExtras(requestType);
+            reply.writeNoException();
+            reply.writeBundle(res);
+            return true;
+        }
+
+        case REPORT_TOP_ACTIVITY_EXTRAS_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            IBinder token = data.readStrongBinder();
+            Bundle extras = data.readBundle();
+            reportTopActivityExtras(token, extras);
+            reply.writeNoException();
+            return true;
+        }
+
         }
 
         return super.onTransact(code, data, reply, flags);
@@ -2856,8 +2875,8 @@
     }
 
     public boolean startInstrumentation(ComponentName className, String profileFile,
-            int flags, Bundle arguments, IInstrumentationWatcher watcher, int userId)
-            throws RemoteException {
+            int flags, Bundle arguments, IInstrumentationWatcher watcher,
+            IUiAutomationConnection connection, int userId) throws RemoteException {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
         data.writeInterfaceToken(IActivityManager.descriptor);
@@ -2866,6 +2885,7 @@
         data.writeInt(flags);
         data.writeBundle(arguments);
         data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
+        data.writeStrongBinder(connection != null ? connection.asBinder() : null);
         data.writeInt(userId);
         mRemote.transact(START_INSTRUMENTATION_TRANSACTION, data, reply, 0);
         reply.readException();
@@ -4149,5 +4169,30 @@
         return res;
     }
 
+    public Bundle getTopActivityExtras(int requestType) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeInt(requestType);
+        mRemote.transact(GET_TOP_ACTIVITY_EXTRAS_TRANSACTION, data, reply, 0);
+        reply.readException();
+        Bundle res = reply.readBundle();
+        data.recycle();
+        reply.recycle();
+        return res;
+    }
+
+    public void reportTopActivityExtras(IBinder token, Bundle extras) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(token);
+        data.writeBundle(extras);
+        mRemote.transact(REPORT_TOP_ACTIVITY_EXTRAS_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
+
     private IBinder mRemote;
 }
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1271645..bb73cf4 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -43,7 +43,6 @@
 import android.database.sqlite.SQLiteDebug.DbStats;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
-import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManagerGlobal;
 import android.net.IConnectivityManager;
 import android.net.Proxy;
@@ -102,7 +101,6 @@
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
 import java.net.InetAddress;
-import java.security.Security;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -420,6 +418,7 @@
         ComponentName instrumentationName;
         Bundle instrumentationArgs;
         IInstrumentationWatcher instrumentationWatcher;
+        IUiAutomationConnection instrumentationUiAutomationConnection;
         int debugMode;
         boolean enableOpenGlTrace;
         boolean restrictedBackupMode;
@@ -533,6 +532,12 @@
         String pkg;
         CompatibilityInfo info;
     }
+
+    static final class RequestActivityExtras {
+        IBinder activityToken;
+        IBinder requestToken;
+        int requestType;
+    }
     
     private native void dumpGraphicsInfo(FileDescriptor fd);
 
@@ -724,9 +729,10 @@
                 ComponentName instrumentationName, String profileFile,
                 ParcelFileDescriptor profileFd, boolean autoStopProfiler,
                 Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher,
-                int debugMode, boolean enableOpenGlTrace, boolean isRestrictedBackupMode,
-                boolean persistent, Configuration config, CompatibilityInfo compatInfo,
-                Map<String, IBinder> services, Bundle coreSettings) {
+                IUiAutomationConnection instrumentationUiConnection, int debugMode,
+                boolean enableOpenGlTrace, boolean isRestrictedBackupMode, boolean persistent,
+                Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
+                Bundle coreSettings) {
 
             if (services != null) {
                 // Setup the service cache in the ServiceManager
@@ -742,6 +748,7 @@
             data.instrumentationName = instrumentationName;
             data.instrumentationArgs = instrumentationArgs;
             data.instrumentationWatcher = instrumentationWatcher;
+            data.instrumentationUiAutomationConnection = instrumentationUiConnection;
             data.debugMode = debugMode;
             data.enableOpenGlTrace = enableOpenGlTrace;
             data.restrictedBackupMode = isRestrictedBackupMode;
@@ -1108,6 +1115,16 @@
             queueOrSendMessage(H.UNSTABLE_PROVIDER_DIED, provider);
         }
 
+        @Override
+        public void requestActivityExtras(IBinder activityToken, IBinder requestToken,
+                int requestType) {
+            RequestActivityExtras cmd = new RequestActivityExtras();
+            cmd.activityToken = activityToken;
+            cmd.requestToken = requestToken;
+            cmd.requestType = requestType;
+            queueOrSendMessage(H.REQUEST_ACTIVITY_EXTRAS, cmd);
+        }
+
         private void printRow(PrintWriter pw, String format, Object...objs) {
             pw.println(String.format(format, objs));
         }
@@ -1173,6 +1190,7 @@
         public static final int TRIM_MEMORY             = 140;
         public static final int DUMP_PROVIDER           = 141;
         public static final int UNSTABLE_PROVIDER_DIED  = 142;
+        public static final int REQUEST_ACTIVITY_EXTRAS = 143;
         String codeToString(int code) {
             if (DEBUG_MESSAGES) {
                 switch (code) {
@@ -1219,6 +1237,7 @@
                     case TRIM_MEMORY: return "TRIM_MEMORY";
                     case DUMP_PROVIDER: return "DUMP_PROVIDER";
                     case UNSTABLE_PROVIDER_DIED: return "UNSTABLE_PROVIDER_DIED";
+                    case REQUEST_ACTIVITY_EXTRAS: return "REQUEST_ACTIVITY_EXTRAS";
                 }
             }
             return Integer.toString(code);
@@ -1430,6 +1449,9 @@
                 case UNSTABLE_PROVIDER_DIED:
                     handleUnstableProviderDied((IBinder)msg.obj, false);
                     break;
+                case REQUEST_ACTIVITY_EXTRAS:
+                    handleRequestActivityExtras((RequestActivityExtras)msg.obj);
+                    break;
             }
             if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));
         }
@@ -2322,6 +2344,23 @@
         performNewIntents(data.token, data.intents);
     }
 
+    public void handleRequestActivityExtras(RequestActivityExtras cmd) {
+        Bundle data = new Bundle();
+        ActivityClientRecord r = mActivities.get(cmd.activityToken);
+        if (r != null) {
+            r.activity.getApplication().dispatchOnProvideAssistData(r.activity, data);
+            r.activity.onProvideAssistData(data);
+        }
+        if (data.isEmpty()) {
+            data = null;
+        }
+        IActivityManager mgr = ActivityManagerNative.getDefault();
+        try {
+            mgr.reportTopActivityExtras(cmd.requestToken, data);
+        } catch (RemoteException e) {
+        }
+    }
+    
     private static final ThreadLocal<Intent> sCurrentBroadcastIntent = new ThreadLocal<Intent>();
 
     /**
@@ -4337,7 +4376,8 @@
             }
 
             mInstrumentation.init(this, instrContext, appContext,
-                    new ComponentName(ii.packageName, ii.name), data.instrumentationWatcher);
+                   new ComponentName(ii.packageName, ii.name), data.instrumentationWatcher,
+                   data.instrumentationUiAutomationConnection);
 
             if (mProfiler.profileFile != null && !ii.handleProfiling
                     && mProfiler.profileFd == null) {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 679c91d..b1d0305 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -44,19 +44,44 @@
     public static final int OP_WRITE_CONTACTS = 5;
     public static final int OP_READ_CALL_LOG = 6;
     public static final int OP_WRITE_CALL_LOG = 7;
+    public static final int OP_READ_CALENDAR = 8;
+    public static final int OP_WRITE_CALENDAR = 9;
+    public static final int OP_WIFI_SCAN = 10;
 
-    public static String opToString(int op) {
-        switch (op) {
-            case OP_COARSE_LOCATION: return "COARSE_LOCATION";
-            case OP_FINE_LOCATION: return "FINE_LOCATION";
-            case OP_GPS: return "GPS";
-            case OP_VIBRATE: return "VIBRATE";
-            case OP_READ_CONTACTS: return "READ_CONTACTS";
-            case OP_WRITE_CONTACTS: return "WRITE_CONTACTS";
-            case OP_READ_CALL_LOG: return "READ_CALL_LOG";
-            case OP_WRITE_CALL_LOG: return "WRITE_CALL_LOG";
-            default: return "Unknown(" + op + ")";
-        }
+    private static String[] sOpNames = new String[] {
+        "COARSE_LOCATION",
+        "FINE_LOCATION",
+        "GPS",
+        "VIBRATE",
+        "READ_CONTACTS",
+        "WRITE_CONTACTS",
+        "READ_CALL_LOG",
+        "WRITE_CALL_LOG",
+        "READ_CALENDAR",
+        "WRITE_CALENDAR",
+        "WIFI_SCAN",
+    };
+
+    private static String[] sOpPerms = new String[] {
+        android.Manifest.permission.ACCESS_COARSE_LOCATION,
+        android.Manifest.permission.ACCESS_FINE_LOCATION,
+        android.Manifest.permission.ACCESS_FINE_LOCATION,
+        android.Manifest.permission.VIBRATE,
+        android.Manifest.permission.READ_CONTACTS,
+        android.Manifest.permission.WRITE_CONTACTS,
+        android.Manifest.permission.READ_CALL_LOG,
+        android.Manifest.permission.WRITE_CALL_LOG,
+        android.Manifest.permission.READ_CALENDAR,
+        android.Manifest.permission.WRITE_CALENDAR,
+        android.Manifest.permission.ACCESS_WIFI_STATE,
+    };
+
+    public static String opToName(int op) {
+        return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")");
+    }
+
+    public static String opToPermission(int op) {
+        return sOpPerms[op];
     }
 
     public static class PackageOps implements Parcelable {
@@ -120,12 +145,16 @@
 
     public static class OpEntry implements Parcelable {
         private final int mOp;
+        private final int mMode;
         private final long mTime;
+        private final long mRejectTime;
         private final int mDuration;
 
-        public OpEntry(int op, long time, int duration) {
+        public OpEntry(int op, int mode, long time, long rejectTime, int duration) {
             mOp = op;
+            mMode = mode;
             mTime = time;
+            mRejectTime = rejectTime;
             mDuration = duration;
         }
 
@@ -133,10 +162,18 @@
             return mOp;
         }
 
+        public int getMode() {
+            return mMode;
+        }
+
         public long getTime() {
             return mTime;
         }
 
+        public long getRejectTime() {
+            return mRejectTime;
+        }
+
         public boolean isRunning() {
             return mDuration == -1;
         }
@@ -153,13 +190,17 @@
         @Override
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeInt(mOp);
+            dest.writeInt(mMode);
             dest.writeLong(mTime);
+            dest.writeLong(mRejectTime);
             dest.writeInt(mDuration);
         }
 
         OpEntry(Parcel source) {
             mOp = source.readInt();
+            mMode = source.readInt();
             mTime = source.readLong();
+            mRejectTime = source.readLong();
             mDuration = source.readInt();
         }
 
@@ -187,6 +228,21 @@
         return null;
     }
 
+    public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
+        try {
+            return mService.getOpsForPackage(uid, packageName, ops);
+        } catch (RemoteException e) {
+        }
+        return null;
+    }
+
+    public void setMode(int code, int uid, String packageName, int mode) {
+        try {
+            mService.setMode(code, uid, packageName, mode);
+        } catch (RemoteException e) {
+        }
+    }
+
     public int checkOp(int op, int uid, String packageName) {
         try {
             int mode = mService.checkOperation(op, uid, packageName);
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java
index 3a67cec..132388e 100644
--- a/core/java/android/app/Application.java
+++ b/core/java/android/app/Application.java
@@ -22,6 +22,7 @@
 import android.content.ComponentCallbacks2;
 import android.content.Context;
 import android.content.ContextWrapper;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
 
@@ -45,6 +46,7 @@
             new ArrayList<ComponentCallbacks>();
     private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
             new ArrayList<ActivityLifecycleCallbacks>();
+    private ArrayList<OnProvideAssistData> mAssistCallbacks = null;
 
     /** @hide */
     public LoadedApk mLoadedApk;
@@ -59,6 +61,21 @@
         void onActivityDestroyed(Activity activity);
     }
 
+    /**
+     * Callback interface for use with {@link Application#registerOnProvideAssistData}
+     * and {@link Application#unregisterOnProvideAssistData}.
+     */
+    public interface OnProvideAssistData {
+        /**
+         * This is called when the user is requesting an assist, to build a full
+         * {@link Intent#ACTION_ASSIST} Intent with all of the context of the current
+         * application.  You can override this method to place into the bundle anything
+         * you would like to appear in the {@link Intent#EXTRA_ASSIST_CONTEXT} part
+         * of the assist Intent.
+         */
+        public void onProvideAssistData(Activity activity, Bundle data);
+    }
+
     public Application() {
         super(null);
     }
@@ -137,7 +154,24 @@
             mActivityLifecycleCallbacks.remove(callback);
         }
     }
-    
+
+    public void registerOnProvideAssistData(OnProvideAssistData callback) {
+        synchronized (this) {
+            if (mAssistCallbacks == null) {
+                mAssistCallbacks = new ArrayList<OnProvideAssistData>();
+            }
+            mAssistCallbacks.add(callback);
+        }
+    }
+
+    public void unregisterOnProvideAssistData(OnProvideAssistData callback) {
+        synchronized (this) {
+            if (mAssistCallbacks != null) {
+                mAssistCallbacks.remove(callback);
+            }
+        }
+    }
+
     // ------------------ Internal API ------------------
     
     /**
@@ -232,4 +266,19 @@
         }
         return callbacks;
     }
+
+    /* package */ void dispatchOnProvideAssistData(Activity activity, Bundle data) {
+        Object[] callbacks;
+        synchronized (this) {
+            if (mAssistCallbacks == null) {
+                return;
+            }
+            callbacks = mAssistCallbacks.toArray();
+        }
+        if (callbacks != null) {
+            for (int i=0; i<callbacks.length; i++) {
+                ((OnProvideAssistData)callbacks[i]).onProvideAssistData(activity, data);
+            }
+        }
+    }
 }
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index 63aa5f9..b1c58f2 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -267,6 +267,9 @@
             Bundle testArgs = data.readBundle();
             IBinder binder = data.readStrongBinder();
             IInstrumentationWatcher testWatcher = IInstrumentationWatcher.Stub.asInterface(binder);
+            binder = data.readStrongBinder();
+            IUiAutomationConnection uiAutomationConnection =
+                    IUiAutomationConnection.Stub.asInterface(binder);
             int testMode = data.readInt();
             boolean openGlTrace = data.readInt() != 0;
             boolean restrictedBackupMode = (data.readInt() != 0);
@@ -277,8 +280,9 @@
             Bundle coreSettings = data.readBundle();
             bindApplication(packageName, info,
                             providers, testName, profileName, profileFd, autoStopProfiler,
-                            testArgs, testWatcher, testMode, openGlTrace, restrictedBackupMode,
-                            persistent, config, compatInfo, services, coreSettings);
+                            testArgs, testWatcher, uiAutomationConnection, testMode,
+                            openGlTrace, restrictedBackupMode, persistent, config, compatInfo,
+                            services, coreSettings);
             return true;
         }
 
@@ -587,6 +591,17 @@
             reply.writeNoException();
             return true;
         }
+
+        case REQUEST_ACTIVITY_EXTRAS_TRANSACTION:
+        {
+            data.enforceInterface(IApplicationThread.descriptor);
+            IBinder activityToken = data.readStrongBinder();
+            IBinder requestToken = data.readStrongBinder();
+            int requestType = data.readInt();
+            requestActivityExtras(activityToken, requestToken, requestType);
+            reply.writeNoException();
+            return true;
+        }
         }
 
         return super.onTransact(code, data, reply, flags);
@@ -863,10 +878,11 @@
     public final void bindApplication(String packageName, ApplicationInfo info,
             List<ProviderInfo> providers, ComponentName testName, String profileName,
             ParcelFileDescriptor profileFd, boolean autoStopProfiler, Bundle testArgs,
-            IInstrumentationWatcher testWatcher, int debugMode, boolean openGlTrace,
-            boolean restrictedBackupMode, boolean persistent,
-            Configuration config, CompatibilityInfo compatInfo,
-            Map<String, IBinder> services, Bundle coreSettings) throws RemoteException {
+            IInstrumentationWatcher testWatcher,
+            IUiAutomationConnection uiAutomationConnection, int debugMode,
+            boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
+            Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
+            Bundle coreSettings) throws RemoteException {
         Parcel data = Parcel.obtain();
         data.writeInterfaceToken(IApplicationThread.descriptor);
         data.writeString(packageName);
@@ -888,6 +904,7 @@
         data.writeInt(autoStopProfiler ? 1 : 0);
         data.writeBundle(testArgs);
         data.writeStrongInterface(testWatcher);
+        data.writeStrongInterface(uiAutomationConnection);
         data.writeInt(debugMode);
         data.writeInt(openGlTrace ? 1 : 0);
         data.writeInt(restrictedBackupMode ? 1 : 0);
@@ -1185,4 +1202,15 @@
         mRemote.transact(UNSTABLE_PROVIDER_DIED_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
         data.recycle();
     }
+
+    public void requestActivityExtras(IBinder activityToken, IBinder requestToken, int requestType)
+            throws RemoteException {
+        Parcel data = Parcel.obtain();
+        data.writeInterfaceToken(IApplicationThread.descriptor);
+        data.writeStrongBinder(activityToken);
+        data.writeStrongBinder(requestToken);
+        data.writeInt(requestType);
+        mRemote.transact(REQUEST_ACTIVITY_EXTRAS_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
+        data.recycle();
+    }
 }
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index fd4389e..e03d3fd 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -1475,7 +1475,7 @@
                 arguments.setAllowFds(false);
             }
             return ActivityManagerNative.getDefault().startInstrumentation(
-                    className, profileFile, 0, arguments, null, getUserId());
+                    className, profileFile, 0, arguments, null, null, getUserId());
         } catch (RemoteException e) {
             // System has crashed, nothing we can do.
         }
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 8af17a4..5a49329 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -158,8 +158,8 @@
     public void killApplicationProcess(String processName, int uid) throws RemoteException;
     
     public boolean startInstrumentation(ComponentName className, String profileFile,
-            int flags, Bundle arguments, IInstrumentationWatcher watcher, int userId)
-            throws RemoteException;
+            int flags, Bundle arguments, IInstrumentationWatcher watcher,
+            IUiAutomationConnection connection, int userId) throws RemoteException;
     public void finishInstrumentation(IApplicationThread target,
             int resultCode, Bundle results) throws RemoteException;
 
@@ -368,6 +368,10 @@
 
     public long inputDispatchingTimedOut(int pid, boolean aboveSystem) throws RemoteException;
 
+    public Bundle getTopActivityExtras(int requestType) throws RemoteException;
+
+    public void reportTopActivityExtras(IBinder token, Bundle extras) throws RemoteException;
+
     /*
      * Private non-Binder interfaces
      */
@@ -624,4 +628,6 @@
     int INPUT_DISPATCHING_TIMED_OUT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+158;
     int CLEAR_PENDING_BACKUP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+159;
     int GET_INTENT_FOR_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+160;
+    int GET_TOP_ACTIVITY_EXTRAS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+161;
+    int REPORT_TOP_ACTIVITY_EXTRAS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+162;
 }
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index 03a26d4..3189b31 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -90,7 +90,8 @@
     void bindApplication(String packageName, ApplicationInfo info, List<ProviderInfo> providers,
             ComponentName testName, String profileName, ParcelFileDescriptor profileFd,
             boolean autoStopProfiler, Bundle testArguments, IInstrumentationWatcher testWatcher,
-            int debugMode, boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
+            IUiAutomationConnection uiAutomationConnection, int debugMode,
+            boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
             Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
             Bundle coreSettings) throws RemoteException;
     void scheduleExit() throws RemoteException;
@@ -130,6 +131,8 @@
     void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException;
     void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException;
     void unstableProviderDied(IBinder provider) throws RemoteException;
+    void requestActivityExtras(IBinder activityToken, IBinder requestToken, int requestType)
+            throws RemoteException;
 
     String descriptor = "android.app.IApplicationThread";
 
@@ -179,4 +182,5 @@
     int DUMP_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+44;
     int DUMP_DB_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+45;
     int UNSTABLE_PROVIDER_DIED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+46;
+    int REQUEST_ACTIVITY_EXTRAS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+47;
 }
diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl
new file mode 100644
index 0000000..09bf829
--- /dev/null
+++ b/core/java/android/app/IUiAutomationConnection.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2013 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.app;
+
+import android.accessibilityservice.IAccessibilityServiceClient;
+import android.graphics.Bitmap;
+import android.view.InputEvent;
+import android.os.ParcelFileDescriptor;
+
+/**
+ * This interface contains privileged operations a shell program can perform
+ * on behalf of an instrumentation that it runs. These operations require
+ * special permissions which the shell user has but the instrumentation does
+ * not. Running privileged operations by the shell user on behalf of an
+ * instrumentation is needed for running UiTestCases. 
+ *
+ * {@hide}
+ */
+interface IUiAutomationConnection {
+    void connect(IAccessibilityServiceClient client);
+    void disconnect();
+    boolean injectInputEvent(in InputEvent event, boolean sync);
+    boolean setRotation(int rotation);
+    Bitmap takeScreenshot(int width, int height);
+    void shutdown();
+}
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index 39186c6..a2eeddd 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -49,7 +49,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-
 /**
  * Base class for implementing application instrumentation code.  When running
  * with instrumentation turned on, this class will be instantiated for you
@@ -59,6 +58,7 @@
  * &lt;instrumentation&gt; tag.
  */
 public class Instrumentation {
+
     /**
      * If included in the status or final bundle sent to an IInstrumentationWatcher, this key 
      * identifies the class that is writing the report.  This can be used to provide more structured
@@ -73,7 +73,7 @@
      * instrumentation can also be launched, and results collected, by an automated system.
      */
     public static final String REPORT_KEY_STREAMRESULT = "stream";
-    
+
     private static final String TAG = "Instrumentation";
     
     private final Object mSync = new Object();
@@ -86,9 +86,11 @@
     private List<ActivityWaiter> mWaitingActivities;
     private List<ActivityMonitor> mActivityMonitors;
     private IInstrumentationWatcher mWatcher;
+    private IUiAutomationConnection mUiAutomationConnection;
     private boolean mAutomaticPerformanceSnapshots = false;
     private PerformanceCollector mPerformanceCollector;
     private Bundle mPerfMetrics = new Bundle();
+    private UiAutomation mUiAutomation;
 
     public Instrumentation() {
     }
@@ -1598,13 +1600,14 @@
 
     /*package*/ final void init(ActivityThread thread,
             Context instrContext, Context appContext, ComponentName component, 
-            IInstrumentationWatcher watcher) {
+            IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection) {
         mThread = thread;
         mMessageQueue = mThread.getLooper().myQueue();
         mInstrContext = instrContext;
         mAppContext = appContext;
         mComponent = component;
         mWatcher = watcher;
+        mUiAutomationConnection = uiAutomationConnection;
     }
 
     /*package*/ static void checkStartActivityResult(int res, Object intent) {
@@ -1644,12 +1647,42 @@
         }
     }
 
+    /**
+     * Gets the {@link UiAutomation} instance.
+     * <p>
+     * <strong>Note:</strong> The APIs exposed via the returned {@link UiAutomation}
+     * work across application boundaries while the APIs exposed by the instrumentation
+     * do not. For example, {@link Instrumentation#sendPointerSync(MotionEvent)} will
+     * not allow you to inject the event in an app different from the instrumentation
+     * target, while {@link UiAutomation#injectInputEvent(android.view.InputEvent, boolean)}
+     * will work regardless of the current application.
+     * </p>
+     * <p>
+     * A typical test case should be using either the {@link UiAutomation} or
+     * {@link Instrumentation} APIs. Using both APIs at the same time is not
+     * a mistake by itself but a client has to be aware of the APIs limitations.
+     * </p>
+     * @return The UI automation instance.
+     *
+     * @see UiAutomation
+     */
+    public UiAutomation getUiAutomation() {
+        if (mUiAutomationConnection != null) {
+            if (mUiAutomation == null) {
+                mUiAutomation = new UiAutomation(getTargetContext().getMainLooper(),
+                        mUiAutomationConnection);
+                mUiAutomation.connect();
+            }
+            return mUiAutomation;
+        }
+        return null;
+    }
+
     private final class InstrumentationThread extends Thread {
         public InstrumentationThread(String name) {
             super(name);
         }
         public void run() {
-            IActivityManager am = ActivityManagerNative.getDefault();
             try {
                 Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY);
             } catch (RuntimeException e) {
@@ -1660,9 +1693,13 @@
                 startPerformanceSnapshot();
             }
             onStart();
+            if (mUiAutomation != null) {
+                mUiAutomation.disconnect();
+                mUiAutomation = null;
+            }
         }
     }
-    
+
     private static final class EmptyRunnable implements Runnable {
         public void run() {
         }
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 6382cee..7dfc589 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -846,8 +846,8 @@
      *
      * @hide
      */
-    public Intent getAssistIntent(Context context) {
-        return getAssistIntent(context, UserHandle.myUserId());
+    public Intent getAssistIntent(Context context, boolean inclContext) {
+        return getAssistIntent(context, inclContext, UserHandle.myUserId());
     }
 
     /**
@@ -856,7 +856,7 @@
      *
      * @hide
      */
-    public Intent getAssistIntent(Context context, int userHandle) {
+    public Intent getAssistIntent(Context context, boolean inclContext, int userHandle) {
         try {
             if (mService == null) {
                 return null;
@@ -867,6 +867,13 @@
             }
             Intent intent = new Intent(Intent.ACTION_ASSIST);
             intent.setComponent(comp);
+            if (inclContext) {
+                IActivityManager am = ActivityManagerNative.getDefault();
+                Bundle extras = am.getTopActivityExtras(0);
+                if (extras != null) {
+                    intent.replaceExtras(extras);
+                }
+            }
             return intent;
         } catch (RemoteException re) {
             Log.e(TAG, "getAssistIntent() failed: " + re);
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
new file mode 100644
index 0000000..e611f6d
--- /dev/null
+++ b/core/java/android/app/UiAutomation.java
@@ -0,0 +1,597 @@
+/*
+ * Copyright (C) 2013 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.app;
+
+import android.accessibilityservice.AccessibilityService.Callbacks;
+import android.accessibilityservice.AccessibilityService.IAccessibilityServiceClientWrapper;
+import android.accessibilityservice.IAccessibilityServiceClient;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Point;
+import android.hardware.display.DisplayManagerGlobal;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.Display;
+import android.view.InputEvent;
+import android.view.Surface;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityInteractionClient;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.IAccessibilityInteractionConnection;
+
+import com.android.internal.util.Predicate;
+
+import java.util.ArrayList;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Class for interacting with the device's UI by simulation user actions and
+ * introspection of the screen content. It relies on the platform accessibility
+ * APIs to introspect the screen and to perform some actions on the remote view
+ * tree. It also allows injecting of arbitrary raw input events simulating user
+ * interaction with keyboards and touch devices.
+ * <p>
+ * The APIs exposed by this class are low-level to maximize flexibility when
+ * developing UI test automation tools and libraries. Generally, a UiAutomation
+ * client should be using a higher-level library or implement high-level functions.
+ * For example, performing a tap on the screen requires construction and injecting
+ * of a touch down and up events which have to be delivered to the system by a
+ * call to {@link #injectInputEvent(InputEvent, boolean)}.
+ * </p>
+ * <p>
+ * The APIs exposed by this class operate across applications enabling a client
+ * to write tests that cover use cases spanning over multiple applications. For
+ * example, going to the settings application to change a setting and then
+ * interacting with another application whose behavior depends on that setting.
+ * </p>
+ */
+public final class UiAutomation {
+
+    private static final String LOG_TAG = UiAutomation.class.getSimpleName();
+
+    private static final boolean DEBUG = false;
+
+    private static final int CONNECTION_ID_UNDEFINED = -1;
+
+    private static final long CONNECT_TIMEOUT_MILLIS = 5000;
+
+    /** Rotation constant: Unfreeze rotation (rotating the device changes its rotation state). */
+    public static final int ROTATION_UNFREEZE = -2;
+
+    /** Rotation constant: Freeze rotation to its current state. */
+    public static final int ROTATION_FREEZE_CURRENT = -1;
+
+    /** Rotation constant: Freeze rotation to 0 degrees (natural orientation) */
+    public static final int ROTATION_FREEZE_0 = Surface.ROTATION_0;
+
+    /** Rotation constant: Freeze rotation to 90 degrees . */
+    public static final int ROTATION_FREEZE_90 = Surface.ROTATION_90;
+
+    /** Rotation constant: Freeze rotation to 180 degrees . */
+    public static final int ROTATION_FREEZE_180 = Surface.ROTATION_180;
+
+    /** Rotation constant: Freeze rotation to 270 degrees . */
+    public static final int ROTATION_FREEZE_270 = Surface.ROTATION_270;
+
+    private final Object mLock = new Object();
+
+    private final ArrayList<AccessibilityEvent> mEventQueue = new ArrayList<AccessibilityEvent>();
+
+    private final IAccessibilityServiceClient mClient;
+
+    private final IUiAutomationConnection mUiAutomationConnection;
+
+    private int mConnectionId = CONNECTION_ID_UNDEFINED;
+
+    private OnAccessibilityEventListener mOnAccessibilityEventListener;
+
+    private boolean mWaitingForEventDelivery;
+
+    private long mLastEventTimeMillis;
+
+    private boolean mIsConnecting;
+
+    /**
+     * Listener for observing the {@link AccessibilityEvent} stream.
+     */
+    public static interface OnAccessibilityEventListener {
+
+        /**
+         * Callback for receiving an {@link AccessibilityEvent}.
+         * <p>
+         * <strong>Note:</strong> This method is <strong>NOT</strong> executed
+         * on the main test thread. The client is responsible for proper
+         * synchronization.
+         * </p>
+         * <p>
+         * <strong>Note:</strong> It is responsibility of the client
+         * to recycle the received events to minimize object creation.
+         * </p>
+         *
+         * @param event The received event.
+         */
+        public void onAccessibilityEvent(AccessibilityEvent event);
+    }
+
+    /**
+     * Creates a new instance that will handle callbacks from the accessibility
+     * layer on the thread of the provided looper and perform requests for privileged
+     * operations on the provided connection.
+     *
+     * @param looper The looper on which to execute accessibility callbacks.
+     * @param connection The connection for performing privileged operations.
+     *
+     * @hide
+     */
+    public UiAutomation(Looper looper, IUiAutomationConnection connection) {
+        if (looper == null) {
+            throw new IllegalArgumentException("Looper cannot be null!");
+        }
+        if (connection == null) {
+            throw new IllegalArgumentException("Connection cannot be null!");
+        }
+        mUiAutomationConnection = connection;
+        mClient = new IAccessibilityServiceClientImpl(looper);
+    }
+
+    /**
+     * Connects this UiAutomation to the accessibility introspection APIs.
+     *
+     * @hide
+     */
+    public void connect() {
+        synchronized (mLock) {
+            throwIfConnectedLocked();
+            if (mIsConnecting) {
+                return;
+            }
+            mIsConnecting = true;
+        }
+
+        try {
+            // Calling out without a lock held.
+            mUiAutomationConnection.connect(mClient);
+        } catch (RemoteException re) {
+            throw new RuntimeException("Error while connecting UiAutomation", re);
+        }
+
+        synchronized (mLock) {
+            final long startTimeMillis = SystemClock.uptimeMillis();
+            try {
+                while (true) {
+                    if (isConnectedLocked()) {
+                        break;
+                    }
+                    final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
+                    final long remainingTimeMillis = CONNECT_TIMEOUT_MILLIS - elapsedTimeMillis;
+                    if (remainingTimeMillis <= 0) {
+                        throw new RuntimeException("Error while connecting UiAutomation");
+                    }
+                    try {
+                        mLock.wait(remainingTimeMillis);
+                    } catch (InterruptedException ie) {
+                        /* ignore */
+                    }
+                }
+            } finally {
+                mIsConnecting = false;
+            }
+        }
+    }
+
+    /**
+     * Disconnects this UiAutomation from the accessibility introspection APIs.
+     *
+     * @hide
+     */
+    public void disconnect() {
+        synchronized (mLock) {
+            if (mIsConnecting) {
+                throw new IllegalStateException(
+                        "Cannot call disconnect() while connecting!");
+            }
+            throwIfNotConnectedLocked();
+            mConnectionId = CONNECTION_ID_UNDEFINED;
+        }
+        try {
+            // Calling out without a lock held.
+            mUiAutomationConnection.disconnect();
+        } catch (RemoteException re) {
+            throw new RuntimeException("Error while disconnecting UiAutomation", re);
+        }
+    }
+
+    /**
+     * The id of the {@link IAccessibilityInteractionConnection} for querying
+     * the screen content. This is here for legacy purposes since some tools use
+     * hidden APIs to introspect the screen.
+     *
+     * @hide
+     */
+    public int getConnectionId() {
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+            return mConnectionId;
+        }
+    }
+
+    /**
+     * Sets a callback for observing the stream of {@link AccessibilityEvent}s.
+     *
+     * @param listener The callback.
+     */
+    public void setOnAccessibilityEventListener(OnAccessibilityEventListener listener) {
+        synchronized (mLock) {
+            mOnAccessibilityEventListener = listener;
+        }
+    }
+
+    /**
+     * Gets the root {@link AccessibilityNodeInfo} in the active window.
+     *
+     * @return The root info.
+     */
+    public AccessibilityNodeInfo getRootInActiveWindow() {
+        final int connectionId;
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+            connectionId = mConnectionId;
+        }
+        // Calling out without a lock held.
+        return AccessibilityInteractionClient.getInstance()
+                .getRootInActiveWindow(connectionId);
+    }
+
+    /**
+     * A method for injecting an arbitrary input event.
+     * <p>
+     * <strong>Note:</strong> It is caller's responsibility to recycle the event.
+     * </p>
+     * @param event The event to inject.
+     * @param sync Whether to inject the event synchronously.
+     * @return Whether event injection succeeded.
+     */
+    public boolean injectInputEvent(InputEvent event, boolean sync) {
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+        }
+        try {
+            if (DEBUG) {
+                Log.i(LOG_TAG, "Injecting: " + event + " sync: " + sync);
+            }
+            // Calling out without a lock held.
+            return mUiAutomationConnection.injectInputEvent(event, sync);
+        } catch (RemoteException re) {
+            Log.e(LOG_TAG, "Error while injecting input event!", re);
+        }
+        return false;
+    }
+
+    /**
+     * Sets the device rotation. A client can freeze the rotation in
+     * desired state or freeze the rotation to its current state or
+     * unfreeze the rotation (rotating the device changes its rotation
+     * state).
+     *
+     * @param rotation The desired rotation.
+     * @return Whether the rotation was set successfully.
+     *
+     * @see #ROTATION_FREEZE_0
+     * @see #ROTATION_FREEZE_90
+     * @see #ROTATION_FREEZE_180
+     * @see #ROTATION_FREEZE_270
+     * @see #ROTATION_FREEZE_CURRENT
+     * @see #ROTATION_UNFREEZE
+     */
+    public boolean setRotation(int rotation) {
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+        }
+        switch (rotation) {
+            case ROTATION_FREEZE_0:
+            case ROTATION_FREEZE_90:
+            case ROTATION_FREEZE_180:
+            case ROTATION_FREEZE_270:
+            case ROTATION_UNFREEZE:
+            case ROTATION_FREEZE_CURRENT: {
+                try {
+                    // Calling out without a lock held.
+                    mUiAutomationConnection.setRotation(rotation);
+                    return true;
+                } catch (RemoteException re) {
+                    Log.e(LOG_TAG, "Error while setting rotation!", re);
+                }
+            } return false;
+            default: {
+                throw new IllegalArgumentException("Invalid rotation.");
+            }
+        }
+    }
+
+    /**
+     * Executes a command and waits for a specific accessibility event up to a
+     * given wait timeout. To detect a sequence of events one can implement a
+     * filter that keeps track of seen events of the expected sequence and
+     * returns true after the last event of that sequence is received.
+     * <p>
+     * <strong>Note:</strong> It is caller's responsibility to recycle the returned event.
+     * </p>
+     * @param command The command to execute.
+     * @param filter Filter that recognizes the expected event.
+     * @param timeoutMillis The wait timeout in milliseconds.
+     *
+     * @throws TimeoutException If the expected event is not received within the timeout.
+     */
+    public AccessibilityEvent executeAndWaitForEvent(Runnable command,
+            Predicate<AccessibilityEvent> filter, long timeoutMillis) throws TimeoutException {
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+
+            mEventQueue.clear();
+            // Prepare to wait for an event.
+            mWaitingForEventDelivery = true;
+
+            // We will ignore events from previous interactions.
+            final long executionStartTimeMillis = SystemClock.uptimeMillis();
+
+            // Execute the command.
+            command.run();
+            try {
+                // Wait for the event.
+                final long startTimeMillis = SystemClock.uptimeMillis();
+                while (true) {
+                    // Drain the event queue
+                    while (!mEventQueue.isEmpty()) {
+                        AccessibilityEvent event = mEventQueue.remove(0);
+                        // Ignore events from previous interactions.
+                        if (event.getEventTime() <= executionStartTimeMillis) {
+                            continue;
+                        }
+                        if (filter.apply(event)) {
+                            return event;
+                        }
+                        event.recycle();
+                    }
+                    // Check if timed out and if not wait.
+                    final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
+                    final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis;
+                    if (remainingTimeMillis <= 0) {
+                        throw new TimeoutException("Expected event not received within: "
+                                + timeoutMillis + " ms.");
+                    }
+                    try {
+                        mLock.wait(remainingTimeMillis);
+                    } catch (InterruptedException ie) {
+                        /* ignore */
+                    }
+                }
+            } finally {
+                mWaitingForEventDelivery = false;
+                mEventQueue.clear();
+                mLock.notifyAll();
+            }
+        }
+    }
+
+    /**
+     * Waits for the accessibility event stream to become idle, which is not to
+     * have received an accessibility event within <code>idleTimeoutMillis</code>.
+     * The total time spent to wait for an idle accessibility event stream is bounded
+     * by the <code>globalTimeoutMillis</code>.
+     *
+     * @param idleTimeoutMillis The timeout in milliseconds between two events
+     *            to consider the device idle.
+     * @param globalTimeoutMillis The maximal global timeout in milliseconds in
+     *            which to wait for an idle state.
+     *
+     * @throws TimeoutException If no idle state was detected within
+     *            <code>globalTimeoutMillis.</code>
+     */
+    public void waitForIdle(long idleTimeoutMillis, long globalTimeoutMillis)
+            throws TimeoutException {
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+
+            final long startTimeMillis = SystemClock.uptimeMillis();
+            if (mLastEventTimeMillis <= 0) {
+                mLastEventTimeMillis = startTimeMillis;
+            }
+
+            while (true) {
+                final long currentTimeMillis = SystemClock.uptimeMillis();
+                // Did we get idle state within the global timeout?
+                final long elapsedGlobalTimeMillis = currentTimeMillis - startTimeMillis;
+                final long remainingGlobalTimeMillis =
+                        globalTimeoutMillis - elapsedGlobalTimeMillis;
+                if (remainingGlobalTimeMillis <= 0) {
+                    throw new TimeoutException("No idle state with idle timeout: "
+                            + idleTimeoutMillis + " within global timeout: "
+                            + globalTimeoutMillis);
+                }
+                // Did we get an idle state within the idle timeout?
+                final long elapsedIdleTimeMillis = currentTimeMillis - mLastEventTimeMillis;
+                final long remainingIdleTimeMillis = idleTimeoutMillis - elapsedIdleTimeMillis;
+                if (remainingIdleTimeMillis <= 0) {
+                    return;
+                }
+                try {
+                     mLock.wait(remainingIdleTimeMillis);
+                } catch (InterruptedException ie) {
+                     /* ignore */
+                }
+            }
+        }
+    }
+
+    /**
+     * Takes a screenshot.
+     *
+     * @return The screenshot bitmap on success, null otherwise.
+     */
+    public Bitmap takeScreenshot() {
+        synchronized (mLock) {
+            throwIfNotConnectedLocked();
+        }
+        Display display = DisplayManagerGlobal.getInstance()
+                .getRealDisplay(Display.DEFAULT_DISPLAY);
+        Point displaySize = new Point();
+        display.getRealSize(displaySize);
+        final int displayWidth = displaySize.x;
+        final int displayHeight = displaySize.y;
+
+        final float screenshotWidth;
+        final float screenshotHeight;
+
+        final int rotation = display.getRotation();
+        switch (rotation) {
+            case ROTATION_FREEZE_0: {
+                screenshotWidth = displayWidth;
+                screenshotHeight = displayHeight;
+            } break;
+            case ROTATION_FREEZE_90: {
+                screenshotWidth = displayHeight;
+                screenshotHeight = displayWidth;
+            } break;
+            case ROTATION_FREEZE_180: {
+                screenshotWidth = displayWidth;
+                screenshotHeight = displayHeight;
+            } break;
+            case ROTATION_FREEZE_270: {
+                screenshotWidth = displayHeight;
+                screenshotHeight = displayWidth;
+            } break;
+            default: {
+                throw new IllegalArgumentException("Invalid rotation: "
+                        + rotation);
+            }
+        }
+
+        // Take the screenshot
+        Bitmap screenShot = null;
+        try {
+            // Calling out without a lock held.
+            screenShot = mUiAutomationConnection.takeScreenshot((int) screenshotWidth,
+                    (int) screenshotHeight);
+            if (screenShot == null) {
+                return null;
+            }
+        } catch (RemoteException re) {
+            Log.e(LOG_TAG, "Error while taking screnshot!", re);
+            return null;
+        }
+
+        // Rotate the screenshot to the current orientation
+        if (rotation != ROTATION_FREEZE_0) {
+            Bitmap unrotatedScreenShot = Bitmap.createBitmap(displayWidth, displayHeight,
+                    Bitmap.Config.ARGB_8888);
+            Canvas canvas = new Canvas(unrotatedScreenShot);
+            canvas.translate(unrotatedScreenShot.getWidth() / 2,
+                    unrotatedScreenShot.getHeight() / 2);
+            canvas.rotate(getDegreesForRotation(rotation));
+            canvas.translate(- screenshotWidth / 2, - screenshotHeight / 2);
+            canvas.drawBitmap(screenShot, 0, 0, null);
+            canvas.setBitmap(null);
+            screenShot = unrotatedScreenShot;
+        }
+
+        // Optimization
+        screenShot.setHasAlpha(false);
+
+        return screenShot;
+    }
+
+    private static float getDegreesForRotation(int value) {
+        switch (value) {
+            case Surface.ROTATION_90: {
+                return 360f - 90f;
+            }
+            case Surface.ROTATION_180: {
+                return 360f - 180f;
+            }
+            case Surface.ROTATION_270: {
+                return 360f - 270f;
+            } default: {
+                return 0;
+            }
+        }
+    }
+
+    private boolean isConnectedLocked() {
+        return mConnectionId != CONNECTION_ID_UNDEFINED;
+    }
+
+    private void throwIfConnectedLocked() {
+        if (mConnectionId != CONNECTION_ID_UNDEFINED) {
+            throw new IllegalStateException("UiAutomation not connected!");
+        }
+    }
+
+    private void throwIfNotConnectedLocked() {
+        if (!isConnectedLocked()) {
+            throw new IllegalStateException("UiAutomation not connected!");
+        }
+    }
+
+    private class IAccessibilityServiceClientImpl extends IAccessibilityServiceClientWrapper {
+
+        public IAccessibilityServiceClientImpl(Looper looper) {
+            super(null, looper, new Callbacks() {
+                @Override
+                public void onSetConnectionId(int connectionId) {
+                    synchronized (mLock) {
+                        mConnectionId = connectionId;
+                        mLock.notifyAll();
+                    }
+                }
+
+                @Override
+                public void onServiceConnected() {
+                    /* do nothing */
+                }
+
+                @Override
+                public void onInterrupt() {
+                    /* do nothing */
+                }
+
+                @Override
+                public boolean onGesture(int gestureId) {
+                    /* do nothing */
+                    return false;
+                }
+
+                @Override
+                public void onAccessibilityEvent(AccessibilityEvent event) {
+                    synchronized (mLock) {
+                        mLastEventTimeMillis = event.getEventTime();
+                        if (mWaitingForEventDelivery) {
+                            mEventQueue.add(AccessibilityEvent.obtain(event));
+                        }
+                        mLock.notifyAll();
+                    }
+                    // Calling out only without a lock held.
+                    final OnAccessibilityEventListener listener = mOnAccessibilityEventListener;
+                    if (listener != null) {
+                        listener.onAccessibilityEvent(AccessibilityEvent.obtain(event));
+                    }
+                }
+            });
+        }
+    }
+}
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
new file mode 100644
index 0000000..9b5857f
--- /dev/null
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2013 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.app;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.accessibilityservice.IAccessibilityServiceClient;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.hardware.input.InputManager;
+import android.os.Binder;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.view.IWindowManager;
+import android.view.InputEvent;
+import android.view.Surface;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.IAccessibilityManager;
+
+/**
+ * This is a remote object that is passed from the shell to an instrumentation
+ * for enabling access to privileged operations which the shell can do and the
+ * instrumentation cannot. These privileged operations are needed for implementing
+ * a {@link UiAutomation} that enables across application testing by simulating
+ * user actions and performing screen introspection.
+ *
+ * @hide
+ */
+public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
+
+    private static final int INITIAL_FROZEN_ROTATION_UNSPECIFIED = -1;
+
+    private final IWindowManager mWindowManager = IWindowManager.Stub.asInterface(
+            ServiceManager.getService(Service.WINDOW_SERVICE));
+
+    private final Object mLock = new Object();
+
+    private int mInitialFrozenRotation = INITIAL_FROZEN_ROTATION_UNSPECIFIED;
+
+    private IAccessibilityServiceClient mClient;
+
+    private boolean mIsShutdown;
+
+    private int mOwningUid;
+
+    public void connect(IAccessibilityServiceClient client) {
+        if (client == null) {
+            throw new IllegalArgumentException("Client cannot be null!");
+        }
+        synchronized (mLock) {
+            throwIfShutdownLocked();
+            if (isConnectedLocked()) {
+                throw new IllegalStateException("Already connected.");
+            }
+            mOwningUid = Binder.getCallingUid();
+            registerUiTestAutomationServiceLocked(client);
+            storeRotationStateLocked();
+        }
+    }
+
+    @Override
+    public void disconnect() {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            if (!isConnectedLocked()) {
+                throw new IllegalStateException("Already disconnected.");
+            }
+            mOwningUid = -1;
+            unregisterUiTestAutomationServiceLocked();
+            restoreRotationStateLocked();
+        }
+    }
+
+    @Override
+    public boolean injectInputEvent(InputEvent event, boolean sync) {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final int mode = (sync) ? InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH
+                : InputManager.INJECT_INPUT_EVENT_MODE_ASYNC;
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            return InputManager.getInstance().injectInputEvent(event, mode);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public boolean setRotation(int rotation) {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            if (rotation == UiAutomation.ROTATION_UNFREEZE) {
+                mWindowManager.thawRotation();
+            } else {
+                mWindowManager.freezeRotation(rotation);
+            }
+            return true;
+        } catch (RemoteException re) {
+            /* ignore */
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+        return false;
+    }
+
+    @Override
+    public Bitmap takeScreenshot(int width, int height) {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            throwIfNotConnectedLocked();
+        }
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            return Surface.screenshot(width, height);
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    @Override
+    public void shutdown() {
+        synchronized (mLock) {
+            throwIfCalledByNotTrustedUidLocked();
+            throwIfShutdownLocked();
+            mIsShutdown = true;
+            if (isConnectedLocked()) {
+                disconnect();
+            }
+        }
+    }
+
+    private void registerUiTestAutomationServiceLocked(IAccessibilityServiceClient client) {
+        IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
+                ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
+        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
+        info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
+        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
+        info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
+                | AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
+        try {
+            // Calling out with a lock held is fine since if the system
+            // process is gone the client calling in will be killed.
+            manager.registerUiTestAutomationService(client, info);
+            mClient = client;
+        } catch (RemoteException re) {
+            throw new IllegalStateException("Error while registering UiTestAutomationService.", re);
+        }
+    }
+
+    private void unregisterUiTestAutomationServiceLocked() {
+        IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
+              ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
+        try {
+            // Calling out with a lock held is fine since if the system
+            // process is gone the client calling in will be killed.
+            manager.unregisterUiTestAutomationService(mClient);
+            mClient = null;
+        } catch (RemoteException re) {
+            throw new IllegalStateException("Error while unregistering UiTestAutomationService",
+                    re);
+        }
+    }
+
+    private void storeRotationStateLocked() {
+        try {
+            if (mWindowManager.isRotationFrozen()) {
+                // Calling out with a lock held is fine since if the system
+                // process is gone the client calling in will be killed.
+                mInitialFrozenRotation = mWindowManager.getRotation();
+            }
+        } catch (RemoteException re) {
+            /* ignore */
+        }
+    }
+
+    private void restoreRotationStateLocked() {
+        try {
+            if (mInitialFrozenRotation != INITIAL_FROZEN_ROTATION_UNSPECIFIED) {
+                // Calling out with a lock held is fine since if the system
+                // process is gone the client calling in will be killed.
+                mWindowManager.freezeRotation(mInitialFrozenRotation);
+            } else {
+                // Calling out with a lock held is fine since if the system
+                // process is gone the client calling in will be killed.
+                mWindowManager.thawRotation();
+            }
+        } catch (RemoteException re) {
+            /* ignore */
+        }
+    }
+
+    private boolean isConnectedLocked() {
+        return mClient != null;
+    }
+
+    private void throwIfShutdownLocked() {
+        if (mIsShutdown) {
+            throw new IllegalStateException("Connection shutdown!");
+        }
+    }
+
+    private void throwIfNotConnectedLocked() {
+        if (!isConnectedLocked()) {
+            throw new IllegalStateException("Not connected!");
+        }
+    }
+
+    private void throwIfCalledByNotTrustedUidLocked() {
+        final int callingUid = Binder.getCallingUid();
+        if (callingUid != mOwningUid && mOwningUid != Process.SYSTEM_UID
+                && callingUid != 0 /*root*/) {
+            throw new SecurityException("Calling from not trusted UID!");
+        }
+    }
+}
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index a6f7abc..4b977ab 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -190,8 +190,13 @@
         public Cursor query(String callingPkg, Uri uri, String[] projection,
                 String selection, String[] selectionArgs, String sortOrder,
                 ICancellationSignal cancellationSignal) {
-            // XXX need content provider to help return correct result.
-            enforceReadPermission(callingPkg, uri);
+            if (enforceReadPermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) {
+                // The read is not allowed...  to fake it out, we replace the given
+                // selection statement with a dummy one that will always be false.
+                // This way we will get a cursor back that has the correct structure
+                // but contains no rows.
+                selection = "'A' = 'B'";
+            }
             return ContentProvider.this.query(uri, projection, selection, selectionArgs, sortOrder,
                     CancellationSignal.fromTransport(cancellationSignal));
         }
@@ -203,8 +208,14 @@
 
         @Override
         public Uri insert(String callingPkg, Uri uri, ContentValues initialValues) {
-            // XXX need content provider to help return correct result.
-            enforceWritePermission(callingPkg, uri);
+            if (enforceWritePermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) {
+                // If not allowed, we need to return some reasonable URI.  Maybe the
+                // content provider should be responsible for this, but for now we
+                // will just return the base URI with a dummy '0' tagged on to it.
+                // You shouldn't be able to read if you can't write, anyway, so it
+                // shouldn't matter much what is returned.
+                return uri.buildUpon().appendPath("0").build();
+            }
             return ContentProvider.this.insert(uri, initialValues);
         }
 
@@ -1189,12 +1200,10 @@
      * Print the Provider's state into the given stream.  This gets invoked if
      * you run "adb shell dumpsys activity provider &lt;provider_component_name&gt;".
      *
-     * @param prefix Desired prefix to prepend at each line of output.
      * @param fd The raw file descriptor that the dump is being sent to.
      * @param writer The PrintWriter to which you should dump your state.  This will be
      * closed for you after you return.
      * @param args additional arguments to the dump request.
-     * @hide
      */
     public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
         writer.println("nothing to dump");
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 63c97ba..f42e845 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -208,7 +208,7 @@
 
     public ContentResolver(Context context) {
         mContext = context != null ? context : ActivityThread.currentApplication();
-        mPackageName = context.getBasePackageName();
+        mPackageName = mContext.getBasePackageName();
     }
 
     /** @hide */
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 89b1bbd..434946c 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -883,7 +883,7 @@
      * Activity Action: Allow the user to select a particular kind of data and
      * return it.  This is different than {@link #ACTION_PICK} in that here we
      * just say what kind of data is desired, not a URI of existing data from
-     * which the user can pick.  A ACTION_GET_CONTENT could allow the user to
+     * which the user can pick.  An ACTION_GET_CONTENT could allow the user to
      * create the data as it runs (for example taking a picture or recording a
      * sound), let them browse over the web and download the desired data,
      * etc.
@@ -917,12 +917,17 @@
      * from a remote server but not already on the local device (thus requiring
      * they be downloaded when opened).
      * <p>
+     * If the caller can handle multiple returned items (the user performing
+     * multiple selection), then it can specify {@link #EXTRA_ALLOW_MULTIPLE}
+     * to indicate this.
+     * <p>
      * Input: {@link #getType} is the desired MIME type to retrieve.  Note
      * that no URI is supplied in the intent, as there are no constraints on
      * where the returned data originally comes from.  You may also include the
      * {@link #CATEGORY_OPENABLE} if you can only accept data that can be
      * opened as a stream.  You may use {@link #EXTRA_LOCAL_ONLY} to limit content
-     * selection to local data.
+     * selection to local data.  You may use {@link #EXTRA_ALLOW_MULTIPLE} to
+     * allow the user to select multiple items.
      * <p>
      * Output: The URI of the item that was picked.  This must be a content:
      * URI so that any receiver can access it.
@@ -1140,14 +1145,33 @@
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
+
     /**
      * Activity Action: Perform assist action.
      * <p>
-     * Input: nothing
+     * Input: {@link #EXTRA_ASSIST_PACKAGE} and {@link #EXTRA_ASSIST_CONTEXT} can provide
+     * additional optional contextual information about where the user was when they requested
+     * the assist.
      * Output: nothing.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_ASSIST = "android.intent.action.ASSIST";
+
+    /**
+     * An optional field on {@link #ACTION_ASSIST} containing the name of the current
+     * foreground application package at the time the assist was invoked.
+     */
+    public static final String EXTRA_ASSIST_PACKAGE
+            = "android.intent.extra.ASSIST_PACKAGE";
+
+    /**
+     * An optional field on {@link #ACTION_ASSIST} containing additional contextual
+     * information supplied by the current foreground app at the time of the assist
+     * request.  This is a {@link Bundle} of additional data.
+     */
+    public static final String EXTRA_ASSIST_CONTEXT
+            = "android.intent.extra.ASSIST_CONTEXT";
+
     /**
      * Activity Action: List all available applications
      * <p>Input: Nothing.
@@ -1588,7 +1612,7 @@
      * <ul>
      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
      * <li> {@link #EXTRA_CHANGED_COMPONENT_NAME_LIST} containing the class name
-     * of the changed components.
+     * of the changed components (or the package name itself).
      * <li> {@link #EXTRA_DONT_KILL_APP} containing boolean field to override the
      * default action of restarting the application.
      * </ul>
@@ -2969,7 +2993,9 @@
 
     /**
      * This field is part of {@link android.content.Intent#ACTION_PACKAGE_CHANGED},
-     * and contains a string array of all of the components that have changed.
+     * and contains a string array of all of the components that have changed.  If
+     * the state of the overall package has changed, then it will contain an entry
+     * with the package name itself.
      */
     public static final String EXTRA_CHANGED_COMPONENT_NAME_LIST =
             "android.intent.extra.changed_component_name_list";
@@ -3024,6 +3050,17 @@
         "android.intent.extra.LOCAL_ONLY";
 
     /**
+     * Used to indicate that a {@link #ACTION_GET_CONTENT} intent can allow the
+     * user to select and return multiple items.  This is a boolean extra; the default
+     * is false.  If true, an implementation of ACTION_GET_CONTENT is allowed to
+     * present the user with a UI where they can pick multiple items that are all
+     * returned to the caller.  When this happens, they should be returned as
+     * the {@link #getClipData()} part of the result Intent.
+     */
+    public static final String EXTRA_ALLOW_MULTIPLE =
+        "android.intent.extra.ALLOW_MULTIPLE";
+
+    /**
      * The userHandle carried with broadcast intents related to addition, removal and switching of users
      * - {@link #ACTION_USER_ADDED}, {@link #ACTION_USER_REMOVED} and {@link #ACTION_USER_SWITCHED}.
      * @hide
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 0445b39..a368451 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -210,6 +210,8 @@
     
     List<PackageInfo> getPreferredPackages(int flags);
 
+    void resetPreferredActivities(int userId);
+
     void addPreferredActivity(in IntentFilter filter, int match,
             in ComponentName[] set, in ComponentName activity, int userId);
 
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index a69f220..d80598c 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -175,6 +175,14 @@
     public static final int GET_CONFIGURATIONS = 0x00004000;
 
     /**
+     * {@link PackageInfo} flag: include disabled components which are in
+     * that state only because of {@link #COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED}
+     * in the returned info.  Note that if you set this flag, applications
+     * that are in this disabled state will be reported as enabled.
+     */
+    public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 0x00008000;
+
+    /**
      * Resolution and querying flag: if set, only filters that support the
      * {@link android.content.Intent#CATEGORY_DEFAULT} will be considered for
      * matching.  This is a synonym for including the CATEGORY_DEFAULT in your
@@ -265,6 +273,19 @@
     public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3;
 
     /**
+     * Flag for {@link #setApplicationEnabledSetting(String, int, int)} only: This
+     * application should be considered, until the point where the user actually
+     * wants to use it.  This means that it will not normally show up to the user
+     * (such as in the launcher), but various parts of the user interface can
+     * use {@link #GET_DISABLED_UNTIL_USED_COMPONENTS} to still see it and allow
+     * the user to select it (as for example an IME, device admin, etc).  Such code,
+     * once the user has selected the app, should at that point also make it enabled.
+     * This option currently <strong>can not</strong> be used with
+     * {@link #setComponentEnabledSetting(ComponentName, int, int)}.
+     */
+    public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4;
+
+    /**
      * Flag parameter for {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} to
      * indicate that this package should be installed as forward locked, i.e. only the app itself
      * should have access to its code and non-resource assets.
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 3e8c2a8..e1887bc 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -3527,29 +3527,45 @@
         return generateApplicationInfo(p, flags, state, UserHandle.getCallingUserId());
     }
 
+    private static void updateApplicationInfo(ApplicationInfo ai, int flags,
+            PackageUserState state) {
+        // CompatibilityMode is global state.
+        if (!sCompatibilityModeEnabled) {
+            ai.disableCompatibilityMode();
+        }
+        if (state.installed) {
+            ai.flags |= ApplicationInfo.FLAG_INSTALLED;
+        } else {
+            ai.flags &= ~ApplicationInfo.FLAG_INSTALLED;
+        }
+        if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
+            ai.enabled = true;
+        } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+            ai.enabled = (flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0;
+        } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+                || state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+            ai.enabled = false;
+        }
+        ai.enabledSetting = state.enabled;
+    }
+
     public static ApplicationInfo generateApplicationInfo(Package p, int flags,
             PackageUserState state, int userId) {
         if (p == null) return null;
         if (!checkUseInstalled(flags, state)) {
             return null;
         }
-        if (!copyNeeded(flags, p, state, null, userId)) {
-            // CompatibilityMode is global state. It's safe to modify the instance
-            // of the package.
-            if (!sCompatibilityModeEnabled) {
-                p.applicationInfo.disableCompatibilityMode();
-            }
-            // Make sure we report as installed.  Also safe to do, since the
-            // default state should be installed (we will always copy if we
-            // need to report it is not installed).
-            p.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED;
-            if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
-                p.applicationInfo.enabled = true;
-            } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
-                    || state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
-                p.applicationInfo.enabled = false;
-            }
-            p.applicationInfo.enabledSetting = state.enabled;
+        if (!copyNeeded(flags, p, state, null, userId)
+                && ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) == 0
+                        || state.enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED)) {
+            // In this case it is safe to directly modify the internal ApplicationInfo state:
+            // - CompatibilityMode is global state, so will be the same for every call.
+            // - We only come in to here if the app should reported as installed; this is the
+            // default state, and we will do a copy otherwise.
+            // - The enable state will always be reported the same for the application across
+            // calls; the only exception is for the UNTIL_USED mode, and in that case we will
+            // be doing a copy.
+            updateApplicationInfo(p.applicationInfo, flags, state);
             return p.applicationInfo;
         }
 
@@ -3565,26 +3581,12 @@
         if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
             ai.sharedLibraryFiles = p.usesLibraryFiles;
         }
-        if (!sCompatibilityModeEnabled) {
-            ai.disableCompatibilityMode();
-        }
         if (state.stopped) {
             ai.flags |= ApplicationInfo.FLAG_STOPPED;
         } else {
             ai.flags &= ~ApplicationInfo.FLAG_STOPPED;
         }
-        if (state.installed) {
-            ai.flags |= ApplicationInfo.FLAG_INSTALLED;
-        } else {
-            ai.flags &= ~ApplicationInfo.FLAG_INSTALLED;
-        }
-        if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
-            ai.enabled = true;
-        } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
-                || state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
-            ai.enabled = false;
-        }
-        ai.enabledSetting = state.enabled;
+        updateApplicationInfo(ai, flags, state);
         return ai;
     }
 
diff --git a/core/java/android/ddm/DdmHandleViewDebug.java b/core/java/android/ddm/DdmHandleViewDebug.java
index a0578fb..ce83796 100644
--- a/core/java/android/ddm/DdmHandleViewDebug.java
+++ b/core/java/android/ddm/DdmHandleViewDebug.java
@@ -32,6 +32,7 @@
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
+import java.lang.reflect.Method;
 import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 
@@ -67,14 +68,14 @@
     /** Obtain the Display List corresponding to the view. */
     private static final int VUOP_DUMP_DISPLAYLIST = 2;
 
-    /** Invalidate View. */
-    private static final int VUOP_INVALIDATE_VIEW = 3;
-
-    /** Re-layout given view. */
-    private static final int VUOP_LAYOUT_VIEW = 4;
-
     /** Profile a view. */
-    private static final int VUOP_PROFILE_VIEW = 5;
+    private static final int VUOP_PROFILE_VIEW = 3;
+
+    /** Invoke a method on the view. */
+    private static final int VUOP_INVOKE_VIEW_METHOD = 4;
+
+    /** Set layout parameter. */
+    private static final int VUOP_SET_LAYOUT_PARAMETER = 5;
 
     /** Error code indicating operation specified in chunk is invalid. */
     private static final int ERR_INVALID_OP = -1;
@@ -82,6 +83,11 @@
     /** Error code indicating that the parameters are invalid. */
     private static final int ERR_INVALID_PARAM = -2;
 
+    /** Error code indicating an exception while performing operation. */
+    private static final int ERR_EXCEPTION = -3;
+
+    private static final String TAG = "DdmViewDebug";
+
     private static final DdmHandleViewDebug sInstance = new DdmHandleViewDebug();
 
     /** singleton, do not instantiate. */
@@ -140,12 +146,12 @@
                     return captureView(rootView, targetView);
                 case VUOP_DUMP_DISPLAYLIST:
                     return dumpDisplayLists(rootView, targetView);
-                case VUOP_INVALIDATE_VIEW:
-                    return invalidateView(rootView, targetView);
-                case VUOP_LAYOUT_VIEW:
-                    return layoutView(rootView, targetView);
                 case VUOP_PROFILE_VIEW:
                     return profileView(rootView, targetView);
+                case VUOP_INVOKE_VIEW_METHOD:
+                    return invokeViewMethod(rootView, targetView, in);
+                case VUOP_SET_LAYOUT_PARAMETER:
+                    return setLayoutParameter(rootView, targetView, in);
                 default:
                     return createFailChunk(ERR_INVALID_OP, "Unknown view operation: " + op);
             }
@@ -276,20 +282,115 @@
         return null;
     }
 
-    /** Invalidates provided view. */
-    private Chunk invalidateView(final View rootView, final View targetView) {
-        targetView.postInvalidate();
+    /**
+     * Invokes provided method on the view.
+     * The method name and its arguments are passed in as inputs via the byte buffer.
+     * The buffer contains:<ol>
+     *  <li> len(method name) </li>
+     *  <li> method name </li>
+     *  <li> # of args </li>
+     *  <li> arguments: Each argument comprises of a type specifier followed by the actual argument.
+     *          The type specifier is a single character as used in JNI:
+     *          (Z - boolean, B - byte, C - char, S - short, I - int, J - long,
+     *          F - float, D - double). <p>
+     *          The type specifier is followed by the actual value of argument.
+     *          Booleans are encoded via bytes with 0 indicating false.</li>
+     * </ol>
+     * Methods that take no arguments need only specify the method name.
+     */
+    private Chunk invokeViewMethod(final View rootView, final View targetView, ByteBuffer in) {
+        int l = in.getInt();
+        String methodName = getString(in, l);
+
+        Class<?>[] argTypes;
+        Object[] args;
+        if (!in.hasRemaining()) {
+            argTypes = new Class<?>[0];
+            args = new Object[0];
+        } else {
+            int nArgs = in.getInt();
+
+            argTypes = new Class<?>[nArgs];
+            args = new Object[nArgs];
+
+            for (int i = 0; i < nArgs; i++) {
+                char c = in.getChar();
+                switch (c) {
+                    case 'Z':
+                        argTypes[i] = boolean.class;
+                        args[i] = in.get() == 0 ? false : true;
+                        break;
+                    case 'B':
+                        argTypes[i] = byte.class;
+                        args[i] = in.get();
+                        break;
+                    case 'C':
+                        argTypes[i] = char.class;
+                        args[i] = in.getChar();
+                        break;
+                    case 'S':
+                        argTypes[i] = short.class;
+                        args[i] = in.getShort();
+                        break;
+                    case 'I':
+                        argTypes[i] = int.class;
+                        args[i] = in.getInt();
+                        break;
+                    case 'J':
+                        argTypes[i] = long.class;
+                        args[i] = in.getLong();
+                        break;
+                    case 'F':
+                        argTypes[i] = float.class;
+                        args[i] = in.getFloat();
+                        break;
+                    case 'D':
+                        argTypes[i] = double.class;
+                        args[i] = in.getDouble();
+                        break;
+                    default:
+                        Log.e(TAG, "arg " + i + ", unrecognized type: " + c);
+                        return createFailChunk(ERR_INVALID_PARAM,
+                                "Unsupported parameter type (" + c + ") to invoke view method.");
+                }
+            }
+        }
+
+        Method method = null;
+        try {
+            method = targetView.getClass().getMethod(methodName, argTypes);
+        } catch (NoSuchMethodException e) {
+            Log.e(TAG, "No such method: " + e.getMessage());
+            return createFailChunk(ERR_INVALID_PARAM,
+                    "No such method: " + e.getMessage());
+        }
+
+        try {
+            ViewDebug.invokeViewMethod(targetView, method, args);
+        } catch (Exception e) {
+            Log.e(TAG, "Exception while invoking method: " + e.getCause().getMessage());
+            String msg = e.getCause().getMessage();
+            if (msg == null) {
+                msg = e.getCause().toString();
+            }
+            return createFailChunk(ERR_EXCEPTION, msg);
+        }
+
         return null;
     }
 
-    /** Lays out provided view. */
-    private Chunk layoutView(View rootView, final View targetView) {
-        rootView.post(new Runnable() {
-            @Override
-            public void run() {
-                targetView.requestLayout();
-            }
-        });
+    private Chunk setLayoutParameter(final View rootView, final View targetView, ByteBuffer in) {
+        int l = in.getInt();
+        String param = getString(in, l);
+        int value = in.getInt();
+        try {
+            ViewDebug.setLayoutParameter(targetView, param, value);
+        } catch (Exception e) {
+            Log.e(TAG, "Exception setting layout parameter: " + e);
+            return createFailChunk(ERR_EXCEPTION, "Error accessing field "
+                        + param + ":" + e.getMessage());
+        }
+
         return null;
     }
 
diff --git a/core/java/android/net/CaptivePortalTracker.java b/core/java/android/net/CaptivePortalTracker.java
index ce71e6b..354a8c4 100644
--- a/core/java/android/net/CaptivePortalTracker.java
+++ b/core/java/android/net/CaptivePortalTracker.java
@@ -370,13 +370,4 @@
         }
         mNotificationShown = visible;
     }
-
-    private static void log(String s) {
-        Log.d(TAG, s);
-    }
-
-    private static void loge(String s) {
-        Log.e(TAG, s);
-    }
-
 }
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index 846443d..c0a894b 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -24,6 +24,7 @@
 import java.net.SocketException;
 import java.security.KeyManagementException;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.ECPrivateKey;
 import javax.net.SocketFactory;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
@@ -88,6 +89,7 @@
     private TrustManager[] mTrustManagers = null;
     private KeyManager[] mKeyManagers = null;
     private byte[] mNpnProtocols = null;
+    private ECPrivateKey mChannelIdPrivateKey = null;
 
     private final int mHandshakeTimeoutMillis;
     private final SSLClientSessionCache mSessionCache;
@@ -319,6 +321,20 @@
     }
 
     /**
+     * Sets the {@link ECPrivateKey} to be used for TLS Channel ID by connections made by this
+     * factory.
+     *
+     * @param privateKey private key (enables TLS Channel ID) or {@code null} for no key (disables
+     *        TLS Channel ID). The private key has to be an Elliptic Curve (EC) key based on the
+     *        NIST P-256 curve (aka SECG secp256r1 or ANSI X9.62 prime256v1).
+     *
+     * @hide
+     */
+    public void setChannelIdPrivateKey(ECPrivateKey privateKey) {
+        mChannelIdPrivateKey = privateKey;
+    }
+
+    /**
      * Enables <a href="http://tools.ietf.org/html/rfc5077#section-3.2">session ticket</a>
      * support on the given socket.
      *
@@ -378,6 +394,7 @@
         OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(k, host, port, close);
         s.setNpnProtocols(mNpnProtocols);
         s.setHandshakeTimeout(mHandshakeTimeoutMillis);
+        s.setChannelIdPrivateKey(mChannelIdPrivateKey);
         if (mSecure) {
             verifyHostname(s, host);
         }
@@ -397,6 +414,7 @@
         OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket();
         s.setNpnProtocols(mNpnProtocols);
         s.setHandshakeTimeout(mHandshakeTimeoutMillis);
+        s.setChannelIdPrivateKey(mChannelIdPrivateKey);
         return s;
     }
 
@@ -414,6 +432,7 @@
                 addr, port, localAddr, localPort);
         s.setNpnProtocols(mNpnProtocols);
         s.setHandshakeTimeout(mHandshakeTimeoutMillis);
+        s.setChannelIdPrivateKey(mChannelIdPrivateKey);
         return s;
     }
 
@@ -429,6 +448,7 @@
         OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(addr, port);
         s.setNpnProtocols(mNpnProtocols);
         s.setHandshakeTimeout(mHandshakeTimeoutMillis);
+        s.setChannelIdPrivateKey(mChannelIdPrivateKey);
         return s;
     }
 
@@ -445,6 +465,7 @@
                 host, port, localAddr, localPort);
         s.setNpnProtocols(mNpnProtocols);
         s.setHandshakeTimeout(mHandshakeTimeoutMillis);
+        s.setChannelIdPrivateKey(mChannelIdPrivateKey);
         if (mSecure) {
             verifyHostname(s, host);
         }
@@ -462,6 +483,7 @@
         OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(host, port);
         s.setNpnProtocols(mNpnProtocols);
         s.setHandshakeTimeout(mHandshakeTimeoutMillis);
+        s.setChannelIdPrivateKey(mChannelIdPrivateKey);
         if (mSecure) {
             verifyHostname(s, host);
         }
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 5ad60ec..222578a 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -48,10 +48,10 @@
     // Barriers are indicated by messages with a null target whose arg1 field carries the token.
     private int mNextBarrierToken;
 
-    private native void nativeInit();
-    private native void nativeDestroy();
-    private native void nativePollOnce(int ptr, int timeoutMillis);
-    private native void nativeWake(int ptr);
+    private native static int nativeInit();
+    private native static void nativeDestroy(int ptr);
+    private native static void nativePollOnce(int ptr, int timeoutMillis);
+    private native static void nativeWake(int ptr);
 
     /**
      * Callback interface for discovering when a thread is going to block
@@ -102,18 +102,25 @@
 
     MessageQueue(boolean quitAllowed) {
         mQuitAllowed = quitAllowed;
-        nativeInit();
+        mPtr = nativeInit();
     }
 
     @Override
     protected void finalize() throws Throwable {
         try {
-            nativeDestroy();
+            dispose();
         } finally {
             super.finalize();
         }
     }
 
+    private void dispose() {
+        if (mPtr != 0) {
+            nativeDestroy(mPtr);
+            mPtr = 0;
+        }
+    }
+
     final Message next() {
         int pendingIdleHandlerCount = -1; // -1 only during first iteration
         int nextPollTimeoutMillis = 0;
@@ -126,6 +133,7 @@
 
             synchronized (this) {
                 if (mQuiting) {
+                    dispose();
                     return null;
                 }
 
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index 69118fe..b79bdee 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -11,7 +11,7 @@
  */
 public class WorkSource implements Parcelable {
     static final String TAG = "WorkSource";
-    static final boolean DEBUG = true;
+    static final boolean DEBUG = false;
 
     int mNum;
     int[] mUids;
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 30a8626..c1af7a5 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -140,7 +140,10 @@
      * Listener that will be called when the TTS service has
      * completed synthesizing an utterance. This is only called if the utterance
      * has an utterance ID (see {@link TextToSpeech.Engine#KEY_PARAM_UTTERANCE_ID}).
+     *
+     * @deprecated Use {@link UtteranceProgressListener} instead.
      */
+    @Deprecated
     public interface OnUtteranceCompletedListener {
         /**
          * Called when an utterance has been synthesized.
@@ -236,19 +239,28 @@
         /**
          * Indicates erroneous data when checking the installation status of the resources used by
          * the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
+         *
+         * @deprecated Use CHECK_VOICE_DATA_FAIL instead.
          */
+        @Deprecated
         public static final int CHECK_VOICE_DATA_BAD_DATA = -1;
 
         /**
          * Indicates missing resources when checking the installation status of the resources used
          * by the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
+         *
+         * @deprecated Use CHECK_VOICE_DATA_FAIL instead.
          */
+        @Deprecated
         public static final int CHECK_VOICE_DATA_MISSING_DATA = -2;
 
         /**
          * Indicates missing storage volume when checking the installation status of the resources
          * used by the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
+         *
+         * @deprecated Use CHECK_VOICE_DATA_FAIL instead.
          */
+        @Deprecated
         public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3;
 
         /**
@@ -284,9 +296,8 @@
                 "android.speech.tts.engine.INSTALL_TTS_DATA";
 
         /**
-         * Broadcast Action: broadcast to signal the completion of the installation of
-         * the data files used by the synthesis engine. Success or failure is indicated in the
-         * {@link #EXTRA_TTS_DATA_INSTALLED} extra.
+         * Broadcast Action: broadcast to signal the change in the list of available
+         * languages or/and their features.
          */
         @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
         public static final String ACTION_TTS_DATA_INSTALLED =
@@ -299,20 +310,16 @@
          * return one of the following codes:
          * {@link #CHECK_VOICE_DATA_PASS},
          * {@link #CHECK_VOICE_DATA_FAIL},
-         * {@link #CHECK_VOICE_DATA_BAD_DATA},
-         * {@link #CHECK_VOICE_DATA_MISSING_DATA}, or
-         * {@link #CHECK_VOICE_DATA_MISSING_VOLUME}.
          * <p> Moreover, the data received in the activity result will contain the following
          * fields:
          * <ul>
-         *   <li>{@link #EXTRA_VOICE_DATA_ROOT_DIRECTORY} which
-         *       indicates the path to the location of the resource files,</li>
-         *   <li>{@link #EXTRA_VOICE_DATA_FILES} which contains
-         *       the list of all the resource files,</li>
-         *   <li>and {@link #EXTRA_VOICE_DATA_FILES_INFO} which
-         *       contains, for each resource file, the description of the language covered by
-         *       the file in the xxx-YYY format, where xxx is the 3-letter ISO language code,
-         *       and YYY is the 3-letter ISO country code.</li>
+         *   <li>{@link #EXTRA_AVAILABLE_VOICES} which contains an ArrayList<String> of all the
+         *   available voices. The format of each voice is: lang-COUNTRY-variant where COUNTRY and
+         *   variant are optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").</li>
+         *   <li>{@link #EXTRA_UNAVAILABLE_VOICES} which contains an ArrayList<String> of all the
+         *   unavailable voices (ones that user can install). The format of each voice is:
+         *   lang-COUNTRY-variant where COUNTRY and variant are optional (ie, "eng" or
+         *   "eng-USA" or "eng-USA-FEMALE").</li>
          * </ul>
          */
         @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -320,37 +327,33 @@
                 "android.speech.tts.engine.CHECK_TTS_DATA";
 
         /**
-         * Activity intent for getting some sample text to use for demonstrating TTS.
+         * Activity intent for getting some sample text to use for demonstrating TTS. Specific
+         * locale have to be requested by passing following extra parameters:
+         * <ul>
+         *   <li>language</li>
+         *   <li>country</li>
+         *   <li>variant</li>
+         * </ul>
          *
-         * @hide This intent was used by engines written against the old API.
-         * Not sure if it should be exposed.
+         * Upon completion, the activity result may contain the following fields:
+         * <ul>
+         *   <li>{@link #EXTRA_SAMPLE_TEXT} which contains an String with sample text.</li>
+         * </ul>
          */
         @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
         public static final String ACTION_GET_SAMPLE_TEXT =
                 "android.speech.tts.engine.GET_SAMPLE_TEXT";
 
+        /**
+         * Extra information received with the {@link #ACTION_GET_SAMPLE_TEXT} intent result where
+         * the TextToSpeech engine returns an String with sample text for requested voice
+         */
+        public static final String EXTRA_SAMPLE_TEXT = "sampleText";
+
+
         // extras for a TTS engine's check data activity
         /**
-         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
-         * the TextToSpeech engine specifies the path to its resources.
-         */
-        public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
-
-        /**
-         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
-         * the TextToSpeech engine specifies the file names of its resources under the
-         * resource path.
-         */
-        public static final String EXTRA_VOICE_DATA_FILES = "dataFiles";
-
-        /**
-         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
-         * the TextToSpeech engine specifies the locale associated with each resource file.
-         */
-        public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
-
-        /**
-         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
+         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent result where
          * the TextToSpeech engine returns an ArrayList<String> of all the available voices.
          * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are
          * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").
@@ -358,7 +361,7 @@
         public static final String EXTRA_AVAILABLE_VOICES = "availableVoices";
 
         /**
-         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
+         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent result where
          * the TextToSpeech engine returns an ArrayList<String> of all the unavailable voices.
          * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are
          * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").
@@ -366,22 +369,63 @@
         public static final String EXTRA_UNAVAILABLE_VOICES = "unavailableVoices";
 
         /**
+         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent result where
+         * the TextToSpeech engine specifies the path to its resources.
+         *
+         * It may be used by language packages to find out where to put their data.
+         *
+         * @deprecated TTS engine implementation detail, this information has no use for
+         * text-to-speech API client.
+         */
+        @Deprecated
+        public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
+
+        /**
+         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent result where
+         * the TextToSpeech engine specifies the file names of its resources under the
+         * resource path.
+         *
+         * @deprecated TTS engine implementation detail, this information has no use for
+         * text-to-speech API client.
+         */
+        @Deprecated
+        public static final String EXTRA_VOICE_DATA_FILES = "dataFiles";
+
+        /**
+         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent result where
+         * the TextToSpeech engine specifies the locale associated with each resource file.
+         *
+         * @deprecated TTS engine implementation detail, this information has no use for
+         * text-to-speech API client.
+         */
+        @Deprecated
+        public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
+
+        /**
          * Extra information sent with the {@link #ACTION_CHECK_TTS_DATA} intent where the
          * caller indicates to the TextToSpeech engine which specific sets of voice data to
          * check for by sending an ArrayList<String> of the voices that are of interest.
          * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are
          * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").
+         *
+         * @deprecated Redundant functionality, checking for existence of specific sets of voice
+         * data can be done on client side.
          */
+        @Deprecated
         public static final String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor";
 
         // extras for a TTS engine's data installation
         /**
-         * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent.
+         * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent result.
          * It indicates whether the data files for the synthesis engine were successfully
          * installed. The installation was initiated with the  {@link #ACTION_INSTALL_TTS_DATA}
          * intent. The possible values for this extra are
          * {@link TextToSpeech#SUCCESS} and {@link TextToSpeech#ERROR}.
+         *
+         * @deprecated No longer in use. If client ise interested in information about what
+         * changed, is should send ACTION_CHECK_TTS_DATA intent to discover available voices.
          */
+        @Deprecated
         public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
 
         // keys for the parameters passed with speak commands. Hidden keys are used internally
@@ -474,11 +518,16 @@
          * for a description of how feature keys work. If set and supported by the engine
          * as per {@link TextToSpeech#getFeatures(Locale)}, the engine must synthesize
          * text on-device (without making network requests).
+         *
+         * @see TextToSpeech#speak(String, int, java.util.HashMap)
+         * @see TextToSpeech#synthesizeToFile(String, java.util.HashMap, String)
+         * @see TextToSpeech#getFeatures(java.util.Locale)
          */
         public static final String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts";
     }
 
     private final Context mContext;
+    private Connection mConnectingServiceConnection;
     private Connection mServiceConnection;
     private OnInitListener mInitListener;
     // Written from an unspecified application thread, read from
@@ -554,21 +603,24 @@
         initTts();
     }
 
-    private <R> R runActionNoReconnect(Action<R> action, R errorResult, String method) {
-        return runAction(action, errorResult, method, false);
+    private <R> R runActionNoReconnect(Action<R> action, R errorResult, String method,
+            boolean onlyEstablishedConnection) {
+        return runAction(action, errorResult, method, false, onlyEstablishedConnection);
     }
 
     private <R> R runAction(Action<R> action, R errorResult, String method) {
-        return runAction(action, errorResult, method, true);
+        return runAction(action, errorResult, method, true, true);
     }
 
-    private <R> R runAction(Action<R> action, R errorResult, String method, boolean reconnect) {
+    private <R> R runAction(Action<R> action, R errorResult, String method,
+            boolean reconnect, boolean onlyEstablishedConnection) {
         synchronized (mStartLock) {
             if (mServiceConnection == null) {
                 Log.w(TAG, method + " failed: not bound to TTS engine");
                 return errorResult;
             }
-            return mServiceConnection.runAction(action, errorResult, method, reconnect);
+            return mServiceConnection.runAction(action, errorResult, method, reconnect,
+                    onlyEstablishedConnection);
         }
     }
 
@@ -631,6 +683,7 @@
             return false;
         } else {
             Log.i(TAG, "Sucessfully bound to " + engine);
+            mConnectingServiceConnection = connection;
             return true;
         }
     }
@@ -654,6 +707,16 @@
      * so the TextToSpeech engine can be cleanly stopped.
      */
     public void shutdown() {
+        // Special case, we are asked to shutdown connection that did finalize its connection.
+        synchronized (mStartLock) {
+            if (mConnectingServiceConnection != null) {
+                mContext.unbindService(mConnectingServiceConnection);
+                mConnectingServiceConnection = null;
+                return;
+            }
+        }
+
+        // Post connection case
         runActionNoReconnect(new Action<Void>() {
             @Override
             public Void run(ITextToSpeechService service) throws RemoteException {
@@ -671,7 +734,7 @@
                 mCurrentEngine = null;
                 return null;
             }
-        }, null, "shutdown");
+        }, null, "shutdown", false);
     }
 
     /**
@@ -1310,7 +1373,9 @@
     private class Connection implements ServiceConnection {
         private ITextToSpeechService mService;
 
-        private OnServiceConnectedAsyncTask mOnServiceConnectedAsyncTask;
+        private SetupConnectionAsyncTask mOnSetupConnectionAsyncTask;
+
+        private boolean mEstablished;
 
         private final ITextToSpeechCallback.Stub mCallback = new ITextToSpeechCallback.Stub() {
             @Override
@@ -1338,13 +1403,11 @@
             }
         };
 
-        private class OnServiceConnectedAsyncTask extends AsyncTask<Void, Void, Integer> {
+        private class SetupConnectionAsyncTask extends AsyncTask<Void, Void, Integer> {
             private final ComponentName mName;
-            private final ITextToSpeechService mConnectedService;
 
-            public OnServiceConnectedAsyncTask(ComponentName name, IBinder service) {
+            public SetupConnectionAsyncTask(ComponentName name) {
                 mName = name;
-                mConnectedService = ITextToSpeechService.Stub.asInterface(service);
             }
 
             @Override
@@ -1355,8 +1418,8 @@
                     }
 
                     try {
-                        mConnectedService.setCallback(getCallerIdentity(), mCallback);
-                        String[] defaultLanguage = mConnectedService.getClientDefaultLanguage();
+                        mService.setCallback(getCallerIdentity(), mCallback);
+                        String[] defaultLanguage = mService.getClientDefaultLanguage();
 
                         mParams.putString(Engine.KEY_PARAM_LANGUAGE, defaultLanguage[0]);
                         mParams.putString(Engine.KEY_PARAM_COUNTRY, defaultLanguage[1]);
@@ -1374,13 +1437,10 @@
             @Override
             protected void onPostExecute(Integer result) {
                 synchronized(mStartLock) {
-                    if (mOnServiceConnectedAsyncTask == this) {
-                        mOnServiceConnectedAsyncTask = null;
+                    if (mOnSetupConnectionAsyncTask == this) {
+                        mOnSetupConnectionAsyncTask = null;
                     }
-
-                    mServiceConnection = Connection.this;
-                    mService = mConnectedService;
-
+                    mEstablished = true;
                     dispatchOnInit(result);
                 }
             }
@@ -1389,14 +1449,20 @@
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             synchronized(mStartLock) {
+                mConnectingServiceConnection = null;
+
                 Log.i(TAG, "Connected to " + name);
 
-                if (mOnServiceConnectedAsyncTask != null) {
-                    mOnServiceConnectedAsyncTask.cancel(false);
+                if (mOnSetupConnectionAsyncTask != null) {
+                    mOnSetupConnectionAsyncTask.cancel(false);
                 }
 
-                mOnServiceConnectedAsyncTask = new OnServiceConnectedAsyncTask(name, service);
-                mOnServiceConnectedAsyncTask.execute();
+                mService = ITextToSpeechService.Stub.asInterface(service);
+                mServiceConnection = Connection.this;
+
+                mEstablished = false;
+                mOnSetupConnectionAsyncTask = new SetupConnectionAsyncTask(name);
+                mOnSetupConnectionAsyncTask.execute();
             }
         }
 
@@ -1407,14 +1473,14 @@
         /**
          * Clear connection related fields and cancel mOnServiceConnectedAsyncTask if set.
          *
-         * @return true if we cancel mOnServiceConnectedAsyncTask in progress.
+         * @return true if we cancel mOnSetupConnectionAsyncTask in progress.
          */
         private boolean clearServiceConnection() {
             synchronized(mStartLock) {
                 boolean result = false;
-                if (mOnServiceConnectedAsyncTask != null) {
-                    result = mOnServiceConnectedAsyncTask.cancel(false);
-                    mOnServiceConnectedAsyncTask = null;
+                if (mOnSetupConnectionAsyncTask != null) {
+                    result = mOnSetupConnectionAsyncTask.cancel(false);
+                    mOnSetupConnectionAsyncTask = null;
                 }
 
                 mService = null;
@@ -1445,13 +1511,22 @@
             clearServiceConnection();
         }
 
-        public <R> R runAction(Action<R> action, R errorResult, String method, boolean reconnect) {
+        public boolean isEstablished() {
+            return mService != null && mEstablished;
+        }
+
+        public <R> R runAction(Action<R> action, R errorResult, String method,
+                boolean reconnect, boolean onlyEstablishedConnection) {
             synchronized (mStartLock) {
                 try {
                     if (mService == null) {
                         Log.w(TAG, method + " failed: not connected to TTS engine");
                         return errorResult;
                     }
+                    if (onlyEstablishedConnection && !isEstablished()) {
+                        Log.w(TAG, method + " failed: TTS engine connection not fully set up");
+                        return errorResult;
+                    }
                     return action.run(mService);
                 } catch (RemoteException ex) {
                     Log.e(TAG, method + " failed", ex);
diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java
index ba82d79..81c25d8 100644
--- a/core/java/android/view/AccessibilityInteractionController.java
+++ b/core/java/android/view/AccessibilityInteractionController.java
@@ -16,8 +16,8 @@
 
 package android.view;
 
-import static android.view.accessibility.AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS;
-
+import android.app.ActivityThread;
+import android.content.Context;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.Bundle;
@@ -34,6 +34,7 @@
 import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
 
 import com.android.internal.os.SomeArgs;
+import com.android.internal.util.Predicate;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -49,7 +50,7 @@
  */
 final class AccessibilityInteractionController {
 
-    private ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
+    private final ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
         new ArrayList<AccessibilityNodeInfo>();
 
     private final Handler mHandler;
@@ -69,6 +70,8 @@
     private final Rect mTempRect1 = new Rect();
     private final Rect mTempRect2 = new Rect();
 
+    private AddNodeInfosForViewId mAddNodeInfosForViewId;
+
     public AccessibilityInteractionController(ViewRootImpl viewRootImpl) {
         Looper looper =  viewRootImpl.mHandler.getLooper();
         mMyLooperThreadId = looper.getThread().getId();
@@ -135,8 +138,7 @@
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
-            mViewRootImpl.mAttachInfo.mIncludeNotImportantViews =
-                (flags & INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
             View root = null;
             if (accessibilityViewId == AccessibilityNodeInfo.UNDEFINED) {
                 root = mViewRootImpl.mView;
@@ -148,7 +150,7 @@
             }
         } finally {
             try {
-                mViewRootImpl.mAttachInfo.mIncludeNotImportantViews = false;
+                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                 applyAppScaleAndMagnificationSpecIfNeeded(infos, spec);
                 if (spec != null) {
                     spec.recycle();
@@ -161,19 +163,19 @@
         }
     }
 
-    public void findAccessibilityNodeInfoByViewIdClientThread(long accessibilityNodeId,
-            int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback,
+    public void findAccessibilityNodeInfosByViewIdClientThread(long accessibilityNodeId,
+            String viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback,
             int flags, int interrogatingPid, long interrogatingTid, MagnificationSpec spec) {
         Message message = mHandler.obtainMessage();
-        message.what = PrivateHandler.MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID;
+        message.what = PrivateHandler.MSG_FIND_ACCESSIBLITY_NODE_INFOS_BY_VIEW_ID;
         message.arg1 = flags;
         message.arg2 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId);
 
         SomeArgs args = SomeArgs.obtain();
-        args.argi1 = viewId;
-        args.argi2 = interactionId;
+        args.argi1 = interactionId;
         args.arg1 = callback;
         args.arg2 = spec;
+        args.arg3 = viewId;
 
         message.obj = args;
 
@@ -189,26 +191,26 @@
         }
     }
 
-    private void findAccessibilityNodeInfoByViewIdUiThread(Message message) {
+    private void findAccessibilityNodeInfosByViewIdUiThread(Message message) {
         final int flags = message.arg1;
         final int accessibilityViewId = message.arg2;
 
         SomeArgs args = (SomeArgs) message.obj;
-        final int viewId = args.argi1;
-        final int interactionId = args.argi2;
+        final int interactionId = args.argi1;
         final IAccessibilityInteractionConnectionCallback callback =
             (IAccessibilityInteractionConnectionCallback) args.arg1;
         final MagnificationSpec spec = (MagnificationSpec) args.arg2;
+        final String viewId = (String) args.arg3;
 
         args.recycle();
 
-        AccessibilityNodeInfo info = null;
+        final List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
+        infos.clear();
         try {
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
-            mViewRootImpl.mAttachInfo.mIncludeNotImportantViews =
-                (flags & INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
             View root = null;
             if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
                 root = findViewByAccessibilityId(accessibilityViewId);
@@ -216,19 +218,31 @@
                 root = mViewRootImpl.mView;
             }
             if (root != null) {
-                View target = root.findViewById(viewId);
-                if (target != null && isShown(target)) {
-                    info = target.createAccessibilityNodeInfo();
+                int resolvedViewId = root.getContext().getResources().getIdentifier(
+                        viewId, "id", root.getContext().getPackageName());
+                if (resolvedViewId <= 0) {
+                    resolvedViewId = ((Context) ActivityThread.currentActivityThread()
+                            .getSystemContext()).getResources()
+                            .getIdentifier(viewId, "id", "android");
                 }
+                if (resolvedViewId <= 0) {
+                    return;
+                }
+                if (mAddNodeInfosForViewId == null) {
+                    mAddNodeInfosForViewId = new AddNodeInfosForViewId();
+                }
+                mAddNodeInfosForViewId.init(resolvedViewId, infos);
+                root.findViewByPredicate(mAddNodeInfosForViewId);
+                mAddNodeInfosForViewId.reset();
             }
         } finally {
             try {
-                mViewRootImpl.mAttachInfo.mIncludeNotImportantViews = false;
-                applyAppScaleAndMagnificationSpecIfNeeded(info, spec);
+                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
+                applyAppScaleAndMagnificationSpecIfNeeded(infos, spec);
                 if (spec != null) {
                     spec.recycle();
                 }
-                callback.setFindAccessibilityNodeInfoResult(info, interactionId);
+                callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
             } catch (RemoteException re) {
                 /* ignore - the other side will time out */
             }
@@ -281,8 +295,7 @@
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
-            mViewRootImpl.mAttachInfo.mIncludeNotImportantViews =
-                (flags & INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
             View root = null;
             if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
                 root = findViewByAccessibilityId(accessibilityViewId);
@@ -325,7 +338,7 @@
             }
         } finally {
             try {
-                mViewRootImpl.mAttachInfo.mIncludeNotImportantViews = false;
+                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                 applyAppScaleAndMagnificationSpecIfNeeded(infos, spec);
                 if (spec != null) {
                     spec.recycle();
@@ -384,8 +397,7 @@
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
-            mViewRootImpl.mAttachInfo.mIncludeNotImportantViews =
-                (flags & INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
             View root = null;
             if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
                 root = findViewByAccessibilityId(accessibilityViewId);
@@ -426,7 +438,7 @@
             }
         } finally {
             try {
-                mViewRootImpl.mAttachInfo.mIncludeNotImportantViews = false;
+                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                 applyAppScaleAndMagnificationSpecIfNeeded(focused, spec);
                 if (spec != null) {
                     spec.recycle();
@@ -484,8 +496,7 @@
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
-            mViewRootImpl.mAttachInfo.mIncludeNotImportantViews =
-                (flags & INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
             View root = null;
             if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
                 root = findViewByAccessibilityId(accessibilityViewId);
@@ -500,7 +511,7 @@
             }
         } finally {
             try {
-                mViewRootImpl.mAttachInfo.mIncludeNotImportantViews = false;
+                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                 applyAppScaleAndMagnificationSpecIfNeeded(next, spec);
                 if (spec != null) {
                     spec.recycle();
@@ -561,8 +572,7 @@
             if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                 return;
             }
-            mViewRootImpl.mAttachInfo.mIncludeNotImportantViews =
-                (flags & INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
             View target = null;
             if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
                 target = findViewByAccessibilityId(accessibilityViewId);
@@ -580,7 +590,7 @@
             }
         } finally {
             try {
-                mViewRootImpl.mAttachInfo.mIncludeNotImportantViews = false;
+                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                 callback.setPerformAccessibilityActionResult(succeeded, interactionId);
             } catch (RemoteException re) {
                 /* ignore - the other side will time out */
@@ -690,20 +700,20 @@
 
         private final ArrayList<View> mTempViewList = new ArrayList<View>();
 
-        public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int prefetchFlags,
+        public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int fetchFlags,
                 List<AccessibilityNodeInfo> outInfos) {
             AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
             if (provider == null) {
                 AccessibilityNodeInfo root = view.createAccessibilityNodeInfo();
                 if (root != null) {
                     outInfos.add(root);
-                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
+                    if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
                         prefetchPredecessorsOfRealNode(view, outInfos);
                     }
-                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
+                    if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
                         prefetchSiblingsOfRealNode(view, outInfos);
                     }
-                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
+                    if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
                         prefetchDescendantsOfRealNode(view, outInfos);
                     }
                 }
@@ -711,13 +721,13 @@
                 AccessibilityNodeInfo root = provider.createAccessibilityNodeInfo(virtualViewId);
                 if (root != null) {
                     outInfos.add(root);
-                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
+                    if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
                         prefetchPredecessorsOfVirtualNode(root, view, provider, outInfos);
                     }
-                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
+                    if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
                         prefetchSiblingsOfVirtualNode(root, view, provider, outInfos);
                     }
-                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
+                    if ((fetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
                         prefetchDescendantsOfVirtualNode(root, provider, outInfos);
                     }
                 }
@@ -920,7 +930,7 @@
     private class PrivateHandler extends Handler {
         private final static int MSG_PERFORM_ACCESSIBILITY_ACTION = 1;
         private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID = 2;
-        private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID = 3;
+        private final static int MSG_FIND_ACCESSIBLITY_NODE_INFOS_BY_VIEW_ID = 3;
         private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT = 4;
         private final static int MSG_FIND_FOCUS = 5;
         private final static int MSG_FOCUS_SEARCH = 6;
@@ -937,8 +947,8 @@
                     return "MSG_PERFORM_ACCESSIBILITY_ACTION";
                 case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID:
                     return "MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID";
-                case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID:
-                    return "MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID";
+                case MSG_FIND_ACCESSIBLITY_NODE_INFOS_BY_VIEW_ID:
+                    return "MSG_FIND_ACCESSIBLITY_NODE_INFOS_BY_VIEW_ID";
                 case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT:
                     return "MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT";
                 case MSG_FIND_FOCUS:
@@ -960,8 +970,8 @@
                 case MSG_PERFORM_ACCESSIBILITY_ACTION: {
                     perfromAccessibilityActionUiThread(message);
                 } break;
-                case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID: {
-                    findAccessibilityNodeInfoByViewIdUiThread(message);
+                case MSG_FIND_ACCESSIBLITY_NODE_INFOS_BY_VIEW_ID: {
+                    findAccessibilityNodeInfosByViewIdUiThread(message);
                 } break;
                 case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT: {
                     findAccessibilityNodeInfosByTextUiThread(message);
@@ -977,4 +987,27 @@
             }
         }
     }
+
+    private final class AddNodeInfosForViewId implements Predicate<View> {
+        private int mViewId = View.NO_ID;
+        private List<AccessibilityNodeInfo> mInfos;
+
+        public void init(int viewId, List<AccessibilityNodeInfo> infos) {
+            mViewId = viewId;
+            mInfos = infos;
+        }
+
+        public void reset() {
+            mViewId = View.NO_ID;
+            mInfos = null;
+        }
+
+        @Override
+        public boolean apply(View view) {
+            if (view.getId() == mViewId && isShown(view)) {
+                mInfos.add(view.createAccessibilityNodeInfo());
+            }
+            return false;
+        }
+    }
 }
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 1ee2bb3..a9ad97f 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -190,6 +190,13 @@
     void thawRotation();
 
     /**
+     * Gets whether the rotation is frozen. 
+     *
+     * @return Whether the rotation is frozen.
+     */
+    boolean isRotationFrozen();
+
+    /**
      * Create a screenshot of the applications currently displayed.
      */
     Bitmap screenshotApplications(IBinder appToken, int displayId, int maxWidth, int maxHeight);
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index c2a3e58..af818fa 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -302,27 +302,27 @@
     public static final int KEYCODE_SWITCH_CHARSET  = 95;   // switch char-sets (Kanji,Katakana)
     /** Key code constant: A Button key.
      * On a game controller, the A button should be either the button labeled A
-     * or the first button on the upper row of controller buttons. */
+     * or the first button on the bottom row of controller buttons. */
     public static final int KEYCODE_BUTTON_A        = 96;
     /** Key code constant: B Button key.
      * On a game controller, the B button should be either the button labeled B
-     * or the second button on the upper row of controller buttons. */
+     * or the second button on the bottom row of controller buttons. */
     public static final int KEYCODE_BUTTON_B        = 97;
     /** Key code constant: C Button key.
      * On a game controller, the C button should be either the button labeled C
-     * or the third button on the upper row of controller buttons. */
+     * or the third button on the bottom row of controller buttons. */
     public static final int KEYCODE_BUTTON_C        = 98;
     /** Key code constant: X Button key.
      * On a game controller, the X button should be either the button labeled X
-     * or the first button on the lower row of controller buttons. */
+     * or the first button on the upper row of controller buttons. */
     public static final int KEYCODE_BUTTON_X        = 99;
     /** Key code constant: Y Button key.
      * On a game controller, the Y button should be either the button labeled Y
-     * or the second button on the lower row of controller buttons. */
+     * or the second button on the upper row of controller buttons. */
     public static final int KEYCODE_BUTTON_Y        = 100;
     /** Key code constant: Z Button key.
      * On a game controller, the Z button should be either the button labeled Z
-     * or the third button on the lower row of controller buttons. */
+     * or the third button on the upper row of controller buttons. */
     public static final int KEYCODE_BUTTON_Z        = 101;
     /** Key code constant: L1 Button key.
      * On a game controller, the L1 button should be either the button labeled L1 (or L)
diff --git a/core/java/android/view/SimulatedDpad.java b/core/java/android/view/SimulatedDpad.java
index 0a37fdd..1ee416c 100644
--- a/core/java/android/view/SimulatedDpad.java
+++ b/core/java/android/view/SimulatedDpad.java
@@ -182,7 +182,7 @@
 
                     Intent intent =
                             ((SearchManager)mContext.getSystemService(Context.SEARCH_SERVICE))
-                            .getAssistIntent(mContext, UserHandle.USER_CURRENT_OR_SELF);
+                            .getAssistIntent(mContext, false, UserHandle.USER_CURRENT_OR_SELF);
                     if (intent != null) {
                         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                         try {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a4e4f37..b9babdc 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -16,6 +16,7 @@
 
 package android.view;
 
+import android.app.ActivityThread;
 import android.content.ClipData;
 import android.content.Context;
 import android.content.res.Configuration;
@@ -5007,6 +5008,25 @@
             if (label != null) {
                 info.setLabeledBy(label);
             }
+
+            if ((mAttachInfo.mAccessibilityFetchFlags
+                    & AccessibilityNodeInfo.FLAG_REPORT_VIEW_IDS) != 0) {
+                String viewId = null;
+                try {
+                    viewId = getResources().getResourceName(mID);
+                } catch (Resources.NotFoundException nfe) {
+                    /* ignore */
+                }
+                if (viewId == null) {
+                    try {
+                        viewId = ((Context) ActivityThread.currentActivityThread()
+                                .getSystemContext()).getResources().getResourceName(mID);
+                    } catch (Resources.NotFoundException nfe) {
+                        /* ignore */
+                    }
+                }
+                info.setViewId(viewId);
+            }
         }
 
         if (mLabelForId != View.NO_ID) {
@@ -6838,7 +6858,9 @@
      */
     public boolean includeForAccessibility() {
         if (mAttachInfo != null) {
-            return mAttachInfo.mIncludeNotImportantViews || isImportantForAccessibility();
+            return (mAttachInfo.mAccessibilityFetchFlags
+                    & AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0
+                    || isImportantForAccessibility();
         }
         return false;
     }
@@ -18004,10 +18026,12 @@
         int mAccessibilityWindowId = View.NO_ID;
 
         /**
-         * Whether to ingore not exposed for accessibility Views when
-         * reporting the view tree to accessibility services.
+         * Flags related to accessibility processing.
+         *
+         * @see AccessibilityNodeInfo#FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
+         * @see AccessibilityNodeInfo#FLAG_REPORT_VIEW_IDS
          */
-        boolean mIncludeNotImportantViews;
+        int mAccessibilityFetchFlags;
 
         /**
          * The drawable for highlighting accessibility focus.
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 6e28268..987ff78 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -45,6 +45,7 @@
 import java.util.HashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Various debugging/tracing tools related to {@link View} and the view hierarchy.
@@ -1374,4 +1375,68 @@
         sb.append(capturedViewExportMethods(view, klass, ""));
         Log.d(tag, sb.toString());
     }
+
+    /**
+     * Invoke a particular method on given view.
+     * The given method is always invoked on the UI thread. The caller thread will stall until the
+     * method invocation is complete. Returns an object equal to the result of the method
+     * invocation, null if the method is declared to return void
+     * @throws Exception if the method invocation caused any exception
+     * @hide
+     */
+    public static Object invokeViewMethod(final View view, final Method method,
+            final Object[] args) {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final AtomicReference<Object> result = new AtomicReference<Object>();
+        final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
+
+        view.post(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    result.set(method.invoke(view, args));
+                } catch (InvocationTargetException e) {
+                    exception.set(e.getCause());
+                } catch (Exception e) {
+                    exception.set(e);
+                }
+
+                latch.countDown();
+            }
+        });
+
+        try {
+            latch.await();
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
+        if (exception.get() != null) {
+            throw new RuntimeException(exception.get());
+        }
+
+        return result.get();
+    }
+
+    /**
+     * @hide
+     */
+    public static void setLayoutParameter(final View view, final String param, final int value)
+            throws NoSuchFieldException, IllegalAccessException {
+        final ViewGroup.LayoutParams p = view.getLayoutParams();
+        final Field f = p.getClass().getField(param);
+        if (f.getType() != int.class) {
+            throw new RuntimeException("Only integer layout parameters can be set. Field "
+                        + param + " is of type " + f.getType().getSimpleName());
+        }
+
+        f.set(p, Integer.valueOf(value));
+
+        view.post(new Runnable() {
+            @Override
+            public void run() {
+                view.setLayoutParams(p);
+            }
+        });
+    }
 }
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 3faac40..ba9eb89 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1513,16 +1513,7 @@
                                 hwInitialized = mAttachInfo.mHardwareRenderer.initialize(
                                         mHolder.getSurface());
                             } catch (Surface.OutOfResourcesException e) {
-                                Log.e(TAG, "OutOfResourcesException initializing HW surface", e);
-                                try {
-                                    if (!mWindowSession.outOfMemory(mWindow) &&
-                                            Process.myUid() != Process.SYSTEM_UID) {
-                                        Slog.w(TAG, "No processes killed for memory; killing self");
-                                        Process.killProcess(Process.myPid());
-                                    }
-                                } catch (RemoteException ex) {
-                                }
-                                mLayoutRequested = true;    // ask wm for a new surface next time.
+                                handleOutOfResourcesException(e);
                                 return;
                             }
                         }
@@ -1549,15 +1540,7 @@
                     try {
                         mAttachInfo.mHardwareRenderer.updateSurface(mHolder.getSurface());
                     } catch (Surface.OutOfResourcesException e) {
-                        Log.e(TAG, "OutOfResourcesException updating HW surface", e);
-                        try {
-                            if (!mWindowSession.outOfMemory(mWindow)) {
-                                Slog.w(TAG, "No processes killed for memory; killing self");
-                                Process.killProcess(Process.myPid());
-                            }
-                        } catch (RemoteException ex) {
-                        }
-                        mLayoutRequested = true;    // ask wm for a new surface next time.
+                        handleOutOfResourcesException(e);
                         return;
                     }
                 }
@@ -1879,6 +1862,19 @@
         mIsInTraversal = false;
     }
 
+    private void handleOutOfResourcesException(Surface.OutOfResourcesException e) {
+        Log.e(TAG, "OutOfResourcesException initializing HW surface", e);
+        try {
+            if (!mWindowSession.outOfMemory(mWindow) &&
+                    Process.myUid() != Process.SYSTEM_UID) {
+                Slog.w(TAG, "No processes killed for memory; killing self");
+                Process.killProcess(Process.myPid());
+            }
+        } catch (RemoteException ex) {
+        }
+        mLayoutRequested = true;    // ask wm for a new surface next time.
+    }
+
     private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) {
         Trace.traceBegin(Trace.TRACE_TAG_VIEW, "measure");
         try {
@@ -2296,8 +2292,35 @@
                         animating ? null : mCurrentDirty)) {
                     mPreviousDirty.set(0, 0, mWidth, mHeight);
                 }
-            } else if (!drawSoftware(surface, attachInfo, yoff, scalingRequired, dirty)) {
-                return;
+            } else {
+                // If we get here with a disabled & requested hardware renderer, something went
+                // wrong (an invalidate posted right before we destroyed the hardware surface
+                // for instance) so we should just bail out. Locking the surface with software
+                // rendering at this point would lock it forever and prevent hardware renderer
+                // from doing its job when it comes back.
+                // Before we request a new frame we must however attempt to reinitiliaze the
+                // hardware renderer if it's in requested state. This would happen after an
+                // eglTerminate() for instance.
+                if (attachInfo.mHardwareRenderer != null &&
+                        !attachInfo.mHardwareRenderer.isEnabled() &&
+                        attachInfo.mHardwareRenderer.isRequested()) {
+
+                    try {
+                        attachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight,
+                                mHolder.getSurface());
+                    } catch (Surface.OutOfResourcesException e) {
+                        handleOutOfResourcesException(e);
+                        return;
+                    }
+
+                    mFullRedrawNeeded = true;
+                    scheduleTraversals();
+                    return;
+                }
+
+                if (!drawSoftware(surface, attachInfo, yoff, scalingRequired, dirty)) {
+                    return;
+                }
             }
         }
 
@@ -2313,18 +2336,6 @@
     private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int yoff,
             boolean scalingRequired, Rect dirty) {
 
-        // If we get here with a disabled & requested hardware renderer, something went
-        // wrong (an invalidate posted right before we destroyed the hardware surface
-        // for instance) so we should just bail out. Locking the surface with software
-        // rendering at this point would lock it forever and prevent hardware renderer
-        // from doing its job when it comes back.
-        if (attachInfo.mHardwareRenderer != null && !attachInfo.mHardwareRenderer.isEnabled() &&
-                attachInfo.mHardwareRenderer.isRequested()) {
-            mFullRedrawNeeded = true;
-            scheduleTraversals();
-            return false;
-        }
-
         // Draw with software renderer.
         Canvas canvas;
         try {
@@ -2343,15 +2354,7 @@
             // TODO: Do this in native
             canvas.setDensity(mDensity);
         } catch (Surface.OutOfResourcesException e) {
-            Log.e(TAG, "OutOfResourcesException locking surface", e);
-            try {
-                if (!mWindowSession.outOfMemory(mWindow)) {
-                    Slog.w(TAG, "No processes killed for memory; killing self");
-                    Process.killProcess(Process.myPid());
-                }
-            } catch (RemoteException ex) {
-            }
-            mLayoutRequested = true;    // ask wm for a new surface next time.
+            handleOutOfResourcesException(e);
             return false;
         } catch (IllegalArgumentException e) {
             Log.e(TAG, "Could not lock surface", e);
@@ -2996,10 +2999,8 @@
                                 mSurface != null && mSurface.isValid()) {
                             mFullRedrawNeeded = true;
                             try {
-                                if (mAttachInfo.mHardwareRenderer.initializeIfNeeded(
-                                        mWidth, mHeight, mHolder.getSurface())) {
-                                    mFullRedrawNeeded = true;
-                                }
+                                mAttachInfo.mHardwareRenderer.initializeIfNeeded(
+                                        mWidth, mHeight, mHolder.getSurface());
                             } catch (Surface.OutOfResourcesException e) {
                                 Log.e(TAG, "OutOfResourcesException locking surface", e);
                                 try {
@@ -5481,15 +5482,16 @@
         }
 
         @Override
-        public void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId,
-                int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
+        public void findAccessibilityNodeInfosByViewId(long accessibilityNodeId,
+                String viewId, int interactionId,
+                IAccessibilityInteractionConnectionCallback callback, int flags,
                 int interrogatingPid, long interrogatingTid, MagnificationSpec spec) {
             ViewRootImpl viewRootImpl = mViewRootImpl.get();
             if (viewRootImpl != null && viewRootImpl.mView != null) {
                 viewRootImpl.getAccessibilityInteractionController()
-                    .findAccessibilityNodeInfoByViewIdClientThread(accessibilityNodeId, viewId,
-                            interactionId, callback, flags, interrogatingPid, interrogatingTid,
-                            spec);
+                    .findAccessibilityNodeInfosByViewIdClientThread(accessibilityNodeId,
+                            viewId, interactionId, callback, flags, interrogatingPid,
+                            interrogatingTid, spec);
             } else {
                 // We cannot make the call and notify the caller so it does not wait.
                 try {
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 9377cfa..02be4db 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1035,6 +1035,16 @@
     public void keepScreenOnStoppedLw();
 
     /**
+     * Gets the current user rotation mode. 
+     *
+     * @return The rotation mode.
+     *
+     * @see WindowManagerPolicy#USER_ROTATION_LOCKED
+     * @see WindowManagerPolicy#USER_ROTATION_FREE 
+     */
+    public int getUserRotationMode();
+
+    /**
      * Inform the policy that the user has chosen a preferred orientation ("rotation lock"). 
      *
      * @param mode One of {@link WindowManagerPolicy#USER_ROTATION_LOCKED} or
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 67df684..84d7e72 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -230,23 +230,25 @@
      *     where to start the search. Use
      *     {@link android.view.accessibility.AccessibilityNodeInfo#ROOT_NODE_ID}
      *     to start from the root.
-     * @param viewId The id of the view.
-     * @return An {@link AccessibilityNodeInfo} if found, null otherwise.
+     * @param viewId The fully qualified resource name of the view id to find.
+     * @return An list of {@link AccessibilityNodeInfo} if found, empty list otherwise.
      */
-    public AccessibilityNodeInfo findAccessibilityNodeInfoByViewId(int connectionId,
-            int accessibilityWindowId, long accessibilityNodeId, int viewId) {
+    public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(int connectionId,
+            int accessibilityWindowId, long accessibilityNodeId, String viewId) {
         try {
             IAccessibilityServiceConnection connection = getConnection(connectionId);
             if (connection != null) {
                 final int interactionId = mInteractionIdCounter.getAndIncrement();
-                final boolean success =connection.findAccessibilityNodeInfoByViewId(
+                final boolean success = connection.findAccessibilityNodeInfosByViewId(
                         accessibilityWindowId, accessibilityNodeId, viewId, interactionId, this,
                         Thread.currentThread().getId());
                 if (success) {
-                    AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear(
+                    List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
                             interactionId);
-                    finalizeAndCacheAccessibilityNodeInfo(info, connectionId);
-                    return info;
+                    if (infos != null) {
+                        finalizeAndCacheAccessibilityNodeInfos(infos, connectionId);
+                        return infos;
+                    }
                 }
             } else {
                 if (DEBUG) {
@@ -259,7 +261,7 @@
                         + " findAccessibilityNodeInfoByViewIdInActiveWindow", re);
             }
         }
-        return null;
+        return Collections.emptyList();
     }
 
     /**
@@ -291,8 +293,10 @@
                 if (success) {
                     List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear(
                             interactionId);
-                    finalizeAndCacheAccessibilityNodeInfos(infos, connectionId);
-                    return infos;
+                    if (infos != null) {
+                        finalizeAndCacheAccessibilityNodeInfos(infos, connectionId);
+                        return infos;
+                    }
                 }
             } else {
                 if (DEBUG) {
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 6c03280..6d0a237 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -16,6 +16,7 @@
 
 package android.view.accessibility;
 
+import android.accessibilityservice.AccessibilityServiceInfo;
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -78,7 +79,10 @@
     public static final int FLAG_PREFETCH_DESCENDANTS = 0x00000004;
 
     /** @hide */
-    public static final int INCLUDE_NOT_IMPORTANT_VIEWS = 0x00000008;
+    public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x00000008;
+
+    /** @hide */
+    public static final int FLAG_REPORT_VIEW_IDS = 0x00000010;
 
     // Actions.
 
@@ -375,6 +379,7 @@
     private CharSequence mClassName;
     private CharSequence mText;
     private CharSequence mContentDescription;
+    private CharSequence mViewId;
 
     private final SparseLongArray mChildNodeIds = new SparseLongArray();
     private int mActions;
@@ -729,6 +734,37 @@
     }
 
     /**
+     * Finds {@link AccessibilityNodeInfo}s by the fully qualified view id's resource
+     * name where a fully qualified id is of the from "package:id/id_resource_name".
+     * For example, if the target application's package is "foo.bar" and the id
+     * resource name is "baz", the fully qualified resource id is "foo.bar:id/baz".
+     *
+     * <p>
+     *   <strong>Note:</strong> It is a client responsibility to recycle the
+     *     received info by calling {@link AccessibilityNodeInfo#recycle()}
+     *     to avoid creating of multiple instances.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> The primary usage of this API is for UI test automation
+     *   and in order to report the fully qualified view id if an {@link AccessibilityNodeInfo}
+     *   the client has to set the {@link AccessibilityServiceInfo#FLAG_REPORT_VIEW_IDS}
+     *   flag when configuring his {@link android.accessibilityservice.AccessibilityService}.
+     * </p>
+     *
+     * @param viewId The fully qualified resource name of the view id to find.
+     * @return A list of node info.
+     */
+    public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId(String viewId) {
+        enforceSealed();
+        if (!canPerformRequestOverConnection(mSourceNodeId)) {
+            return Collections.emptyList();
+        }
+        AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
+        return client.findAccessibilityNodeInfosByViewId(mConnectionId, mWindowId, mSourceNodeId,
+                viewId);
+    }
+
+    /**
      * Gets the parent.
      * <p>
      *   <strong>Note:</strong> It is a client responsibility to recycle the
@@ -1373,6 +1409,38 @@
     }
 
     /**
+     * Sets the fully qualified resource name of the source view's id.
+     *
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param viewId The id resource name.
+     */
+    public void setViewId(CharSequence viewId) {
+        enforceNotSealed();
+        mViewId = viewId;
+    }
+
+    /**
+     * Gets the fully qualified resource name of the source view's id.
+     *
+     * <p>
+     *   <strong>Note:</strong> The primary usage of this API is for UI test automation
+     *   and in order to report the source view id of an {@link AccessibilityNodeInfo} the
+     *   client has to set the {@link AccessibilityServiceInfo#FLAG_REPORT_VIEW_IDS}
+     *   flag when configuring his {@link android.accessibilityservice.AccessibilityService}.
+     * </p>
+
+     * @return The id resource name.
+     */
+    public CharSequence getViewId() {
+        return mViewId;
+    }
+
+    /**
      * Gets the value of a boolean property.
      *
      * @param property The property.
@@ -1614,6 +1682,7 @@
         parcel.writeCharSequence(mClassName);
         parcel.writeCharSequence(mText);
         parcel.writeCharSequence(mContentDescription);
+        parcel.writeCharSequence(mViewId);
 
         // Since instances of this class are fetched via synchronous i.e. blocking
         // calls in IPCs we always recycle as soon as the instance is marshaled.
@@ -1639,6 +1708,7 @@
         mClassName = other.mClassName;
         mText = other.mText;
         mContentDescription = other.mContentDescription;
+        mViewId = other.mViewId;
         mActions= other.mActions;
         mBooleanProperties = other.mBooleanProperties;
         mMovementGranularities = other.mMovementGranularities;
@@ -1689,6 +1759,7 @@
         mClassName = parcel.readCharSequence();
         mText = parcel.readCharSequence();
         mContentDescription = parcel.readCharSequence();
+        mViewId = parcel.readCharSequence();
     }
 
     /**
@@ -1711,6 +1782,7 @@
         mClassName = null;
         mText = null;
         mContentDescription = null;
+        mViewId = null;
         mActions = 0;
     }
 
@@ -1855,6 +1927,7 @@
         builder.append("; className: ").append(mClassName);
         builder.append("; text: ").append(mText);
         builder.append("; contentDescription: ").append(mContentDescription);
+        builder.append("; viewId: ").append(mViewId);
 
         builder.append("; checkable: ").append(isCheckable());
         builder.append("; checked: ").append(isChecked());
diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
index c313b07..8d15472 100644
--- a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl
@@ -33,9 +33,9 @@
         IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid,
         long interrogatingTid, in MagnificationSpec spec);
 
-    void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId, int interactionId,
-        IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid,
-        long interrogatingTid, in MagnificationSpec spec);
+    void findAccessibilityNodeInfosByViewId(long accessibilityNodeId, String viewId,
+        int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags,
+        int interrogatingPid, long interrogatingTid, in MagnificationSpec spec);
 
     void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text, int interactionId,
         IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid,
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index 08e30aa..54c2ba5 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -81,6 +81,11 @@
     private boolean mIsAuxIme;
 
     /**
+     * Cavert: mForceDefault must be false for production. This flag is only for test.
+     */
+    private final boolean mForceDefault;
+
+    /**
      * Constructor.
      *
      * @param context The Context in which we are parsing the input method.
@@ -108,6 +113,7 @@
         ServiceInfo si = service.serviceInfo;
         mId = new ComponentName(si.packageName, si.name).flattenToShortString();
         mIsAuxIme = true;
+        mForceDefault = false;
 
         PackageManager pm = context.getPackageManager();
         String settingsActivityComponent = null;
@@ -215,13 +221,39 @@
         mIsAuxIme = source.readInt() == 1;
         mService = ResolveInfo.CREATOR.createFromParcel(source);
         source.readTypedList(mSubtypes, InputMethodSubtype.CREATOR);
+        mForceDefault = false;
     }
 
     /**
-     * Temporary API for creating a built-in input method.
+     * Temporary API for creating a built-in input method for test.
      */
     public InputMethodInfo(String packageName, String className,
             CharSequence label, String settingsActivity) {
+        this(buildDummyResolveInfo(packageName, className, label), false, settingsActivity, null,
+                0, false);
+    }
+
+    /**
+     * Temporary API for creating a built-in input method for test.
+     * @hide
+     */
+    public InputMethodInfo(ResolveInfo ri, boolean isAuxIme,
+            String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId,
+            boolean forceDefault) {
+        final ServiceInfo si = ri.serviceInfo;
+        mService = ri;
+        mId = new ComponentName(si.packageName, si.name).flattenToShortString();
+        mSettingsActivityName = settingsActivity;
+        mIsDefaultResId = isDefaultResId;
+        mIsAuxIme = isAuxIme;
+        if (subtypes != null) {
+            mSubtypes.addAll(subtypes);
+        }
+        mForceDefault = forceDefault;
+    }
+
+    private static ResolveInfo buildDummyResolveInfo(String packageName, String className,
+            CharSequence label) {
         ResolveInfo ri = new ResolveInfo();
         ServiceInfo si = new ServiceInfo();
         ApplicationInfo ai = new ApplicationInfo();
@@ -234,11 +266,7 @@
         si.exported = true;
         si.nonLocalizedLabel = label;
         ri.serviceInfo = si;
-        mService = ri;
-        mId = new ComponentName(si.packageName, si.name).flattenToShortString();
-        mSettingsActivityName = settingsActivity;
-        mIsDefaultResId = 0;
-        mIsAuxIme = false;
+        return ri;
     }
 
     /**
@@ -340,6 +368,22 @@
         return mIsDefaultResId;
     }
 
+    /**
+     * Return whether or not this ime is a default ime or not.
+     * @hide
+     */
+    public boolean isDefault(Context context) {
+        if (mForceDefault) {
+            return true;
+        }
+        try {
+            final Resources res = context.createPackageContext(getPackageName(), 0).getResources();
+            return res.getBoolean(getIsDefaultResourceId());
+        } catch (NameNotFoundException e) {
+            return false;
+        }
+    }
+
     public void dump(Printer pw, String prefix) {
         pw.println(prefix + "mId=" + mId
                 + " mSettingsActivityName=" + mSettingsActivityName);
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 6fb8bdf..0b7e92f 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -56,8 +56,8 @@
 import java.util.Set;
 
 import org.apache.harmony.security.provider.cert.X509CertImpl;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLDSAPrivateKey;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLRSAPrivateKey;
+import org.apache.harmony.xnet.provider.jsse.OpenSSLKey;
+import org.apache.harmony.xnet.provider.jsse.OpenSSLKeyHolder;
 
 class BrowserFrame extends Handler {
 
@@ -1127,13 +1127,10 @@
         if (table.IsAllowed(hostAndPort)) {
             // previously allowed
             PrivateKey pkey = table.PrivateKey(hostAndPort);
-            if (pkey instanceof OpenSSLRSAPrivateKey) {
+            if (pkey instanceof OpenSSLKeyHolder) {
+                OpenSSLKey sslKey = ((OpenSSLKeyHolder) pkey).getOpenSSLKey();
                 nativeSslClientCert(handle,
-                                    ((OpenSSLRSAPrivateKey)pkey).getPkeyContext(),
-                                    table.CertificateChain(hostAndPort));
-            } else if (pkey instanceof OpenSSLDSAPrivateKey) {
-                nativeSslClientCert(handle,
-                                    ((OpenSSLDSAPrivateKey)pkey).getPkeyContext(),
+                                    sslKey.getPkeyContext(),
                                     table.CertificateChain(hostAndPort));
             } else {
                 nativeSslClientCert(handle,
diff --git a/core/java/android/webkit/ClientCertRequestHandler.java b/core/java/android/webkit/ClientCertRequestHandler.java
index 6570a9b8..dac1510 100644
--- a/core/java/android/webkit/ClientCertRequestHandler.java
+++ b/core/java/android/webkit/ClientCertRequestHandler.java
@@ -21,8 +21,8 @@
 import java.security.cert.CertificateEncodingException;
 import java.security.cert.X509Certificate;
 import org.apache.harmony.xnet.provider.jsse.NativeCrypto;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLDSAPrivateKey;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLRSAPrivateKey;
+import org.apache.harmony.xnet.provider.jsse.OpenSSLKey;
+import org.apache.harmony.xnet.provider.jsse.OpenSSLKeyHolder;
 
 /**
  * ClientCertRequestHandler: class responsible for handling client
@@ -56,14 +56,11 @@
             byte[][] chainBytes = NativeCrypto.encodeCertificates(chain);
             mTable.Allow(mHostAndPort, privateKey, chainBytes);
 
-            if (privateKey instanceof OpenSSLRSAPrivateKey) {
-                setSslClientCertFromCtx(((OpenSSLRSAPrivateKey)privateKey).getPkeyContext(),
-                           chainBytes);
-            } else if (privateKey instanceof OpenSSLDSAPrivateKey) {
-                setSslClientCertFromCtx(((OpenSSLDSAPrivateKey)privateKey).getPkeyContext(),
-                           chainBytes);
+            if (privateKey instanceof OpenSSLKeyHolder) {
+                OpenSSLKey pkey = ((OpenSSLKeyHolder) privateKey).getOpenSSLKey();
+                setSslClientCertFromCtx(pkey.getPkeyContext(), chainBytes);
             } else {
-                setSslClientCertFromPKCS8(privateKey.getEncoded(),chainBytes);
+                setSslClientCertFromPKCS8(privateKey.getEncoded(), chainBytes);
             }
         } catch (CertificateEncodingException e) {
             post(new Runnable() {
diff --git a/core/java/android/webkit/FindActionModeCallback.java b/core/java/android/webkit/FindActionModeCallback.java
index d7a0b60..c68b450 100644
--- a/core/java/android/webkit/FindActionModeCallback.java
+++ b/core/java/android/webkit/FindActionModeCallback.java
@@ -163,7 +163,7 @@
             mActiveMatchIndex = matchIndex;
             updateMatchesString();
         } else {
-            mMatches.setVisibility(View.INVISIBLE);
+            mMatches.setVisibility(View.GONE);
             mNumberOfMatches = 0;
         }
     }
diff --git a/core/java/android/webkit/SslErrorHandler.java b/core/java/android/webkit/SslErrorHandler.java
index 3a43950..af31544 100644
--- a/core/java/android/webkit/SslErrorHandler.java
+++ b/core/java/android/webkit/SslErrorHandler.java
@@ -19,9 +19,11 @@
 import android.os.Handler;
 
 /**
- * SslErrorHandler: class responsible for handling SSL errors.
- * This class is passed as a parameter to BrowserCallback.displaySslErrorDialog
- * and is meant to receive the user's response.
+ * Represents a request for handling an SSL error. Instances of this class are
+ * created by the WebView and passed to
+ * {@link WebViewClient#onReceivedSslError}. The host application must call
+ * either {@link #proceed} or {@link #cancel} to set the WebView's response
+ * to the request.
  */
 public class SslErrorHandler extends Handler {
 
diff --git a/core/java/android/webkit/ViewStateSerializer.java b/core/java/android/webkit/ViewStateSerializer.java
index 096d4cda..1d44b96 100644
--- a/core/java/android/webkit/ViewStateSerializer.java
+++ b/core/java/android/webkit/ViewStateSerializer.java
@@ -31,7 +31,8 @@
 
     private static final int WORKING_STREAM_STORAGE = 16 * 1024;
 
-    static final int VERSION = 1;
+    // VERSION = 1 was for pictures encoded using a previous copy of libskia
+    static final int VERSION = 2;
 
     static boolean serializeViewState(OutputStream stream, DrawData draw)
             throws IOException {
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 57bf0d3..396fd68 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1374,9 +1374,11 @@
         if (isEnabled()) {
             if (getFirstVisiblePosition() > 0) {
                 info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+                info.setScrollable(true);
             }
             if (getLastVisiblePosition() < getCount() - 1) {
                 info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+                info.setScrollable(true);
             }
         }
     }
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 4eaa78a..c270e9d 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -2694,23 +2694,14 @@
             TypedArray styledAttributes = mTextView.getContext().obtainStyledAttributes(
                     com.android.internal.R.styleable.SelectionModeDrawables);
 
-            boolean allowText = mTextView.getContext().getResources().getBoolean(
-                    com.android.internal.R.bool.config_allowActionMenuItemTextWithIcon);
-
             mode.setTitle(mTextView.getContext().getString(
                     com.android.internal.R.string.textSelectionCABTitle));
             mode.setSubtitle(null);
             mode.setTitleOptionalHint(true);
 
-            int selectAllIconId = 0; // No icon by default
-            if (!allowText) {
-                // Provide an icon, text will not be displayed on smaller screens.
-                selectAllIconId = styledAttributes.getResourceId(
-                        R.styleable.SelectionModeDrawables_actionModeSelectAllDrawable, 0);
-            }
-
             menu.add(0, TextView.ID_SELECT_ALL, 0, com.android.internal.R.string.selectAll).
-                    setIcon(selectAllIconId).
+                    setIcon(styledAttributes.getResourceId(
+                            R.styleable.SelectionModeDrawables_actionModeSelectAllDrawable, 0)).
                     setAlphabeticShortcut('a').
                     setShowAsAction(
                             MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index e749e63..dbeb26d 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -37,6 +37,7 @@
 import android.view.View;
 import android.view.ViewDebug;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.RemoteViews.RemoteView;
@@ -220,10 +221,13 @@
     // Some apps came to rely on them. :(
     private boolean mAllowBrokenMeasureSpecs = false;
 
+    private int mDisplayWidth;
+
     public RelativeLayout(Context context) {
         super(context);
         mAllowBrokenMeasureSpecs = context.getApplicationInfo().targetSdkVersion <=
                 Build.VERSION_CODES.JELLY_BEAN_MR1;
+        getDisplayWidth();
     }
 
     public RelativeLayout(Context context, AttributeSet attrs) {
@@ -231,6 +235,7 @@
         initFromAttributes(context, attrs);
         mAllowBrokenMeasureSpecs = context.getApplicationInfo().targetSdkVersion <=
                 Build.VERSION_CODES.JELLY_BEAN_MR1;
+        getDisplayWidth();
     }
 
     public RelativeLayout(Context context, AttributeSet attrs, int defStyle) {
@@ -238,6 +243,7 @@
         initFromAttributes(context, attrs);
         mAllowBrokenMeasureSpecs = context.getApplicationInfo().targetSdkVersion <=
                 Build.VERSION_CODES.JELLY_BEAN_MR1;
+        getDisplayWidth();
     }
 
     private void initFromAttributes(Context context, AttributeSet attrs) {
@@ -247,6 +253,11 @@
         a.recycle();
     }
 
+    private void getDisplayWidth() {
+        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
+        mDisplayWidth = wm.getDefaultDisplay().getWidth();
+    }
+
     @Override
     public boolean shouldDelayChildPressedState() {
         return false;
@@ -438,51 +449,28 @@
         final boolean isWrapContentWidth = widthMode != MeasureSpec.EXACTLY;
         final boolean isWrapContentHeight = heightMode != MeasureSpec.EXACTLY;
 
+        // We need to know our size for doing the correct computation of children positioning in RTL
+        // mode but there is no practical way to get it instead of running the code below.
+        // So, instead of running the code twice, we just set the width to the "display width"
+        // before the computation and then, as a last pass, we will update their real position with
+        // an offset equals to "displayWidth - width".
+        final int layoutDirection = getLayoutDirection();
+        if (isLayoutRtl() && myWidth == -1) {
+            myWidth = mDisplayWidth;
+        }
+
         View[] views = mSortedHorizontalChildren;
         int count = views.length;
 
-        // We need to know our size for doing the correct computation of positioning in RTL mode
-        if (isLayoutRtl() && (myWidth == -1 || isWrapContentWidth)) {
-            int w = getPaddingStart() + getPaddingEnd();
-            final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-            for (int i = 0; i < count; i++) {
-                View child = views[i];
-                if (child.getVisibility() != GONE) {
-                    LayoutParams params = (LayoutParams) child.getLayoutParams();
-                    // Would be similar to a call to measureChildHorizontal(child, params, -1, myHeight)
-                    // but we cannot change for now the behavior of measureChildHorizontal() for
-                    // taking care or a "-1" for "mywidth" so use here our own version of that code.
-                    int childHeightMeasureSpec;
-                    if (params.width == LayoutParams.MATCH_PARENT) {
-                        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.EXACTLY);
-                    } else {
-                        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(myHeight, MeasureSpec.AT_MOST);
-                    }
-                    child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
-
-                    w += child.getMeasuredWidth();
-                    w += params.leftMargin + params.rightMargin;
-                }
-            }
-            if (myWidth == -1) {
-                // Easy case: "myWidth" was undefined before so use the width we have just computed
-                myWidth = w;
-            } else {
-                // "myWidth" was defined before, so take the min of it and the computed width if it
-                // is a non null one
-                if (w > 0) {
-                    myWidth = Math.min(myWidth, w);
-                }
-            }
-        }
-
         for (int i = 0; i < count; i++) {
             View child = views[i];
             if (child.getVisibility() != GONE) {
                 LayoutParams params = (LayoutParams) child.getLayoutParams();
+                int[] rules = params.getRules(layoutDirection);
 
-                applyHorizontalSizeRules(params, myWidth);
+                applyHorizontalSizeRules(params, myWidth, rules);
                 measureChildHorizontal(child, params, myWidth, myHeight);
+
                 if (positionChildHorizontal(child, params, myWidth, isWrapContentWidth)) {
                     offsetHorizontalAxis = true;
                 }
@@ -504,7 +492,11 @@
                 }
 
                 if (isWrapContentWidth) {
-                    width = Math.max(width, params.mRight);
+                    if (isLayoutRtl()) {
+                        width = Math.max(width, myWidth - params.mLeft);
+                    } else {
+                        width = Math.max(width, params.mRight);
+                    }
                 }
 
                 if (isWrapContentHeight) {
@@ -543,8 +535,6 @@
             }
         }
 
-        final int layoutDirection = getLayoutDirection();
-
         if (isWrapContentWidth) {
             // Width already has left padding in it since it was calculated by looking at
             // the right of each child view
@@ -634,6 +624,19 @@
             }
         }
 
+        if (isLayoutRtl()) {
+            final int offsetWidth = myWidth - width;
+            for (int i = 0; i < count; i++) {
+                View child = getChildAt(i);
+                if (child.getVisibility() != GONE) {
+                    LayoutParams params = (LayoutParams) child.getLayoutParams();
+                    params.mLeft -= offsetWidth;
+                    params.mRight -= offsetWidth;
+                }
+            }
+
+        }
+
         setMeasuredDimension(width, height);
     }
 
@@ -862,9 +865,7 @@
         return rules[ALIGN_PARENT_BOTTOM] != 0;
     }
 
-    private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth) {
-        final int layoutDirection = getLayoutDirection();
-        int[] rules = childParams.getRules(layoutDirection);
+    private void applyHorizontalSizeRules(LayoutParams childParams, int myWidth, int[] rules) {
         RelativeLayout.LayoutParams anchorParams;
 
         // -1 indicated a "soft requirement" in that direction. For example:
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index 46478ca..f041f07 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -801,6 +801,11 @@
         return mThemedContext;
     }
     
+    @Override
+    public boolean isTitleTruncated() {
+        return mActionView != null && mActionView.isTitleTruncated();
+    }
+
     /**
      * @hide 
      */
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 827dba6..c4f1bc4 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -20,6 +20,8 @@
 
 interface IAppOpsService {
     List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops);
+    List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
+    void setMode(int code, int uid, String packageName, int mode);
     int checkOperation(int code, int uid, String packageName);
     int noteOperation(int code, int uid, String packageName);
     int startOperation(int code, int uid, String packageName);
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 20ecace..424c19b 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -153,8 +153,33 @@
 
     public void onPackageUpdateFinished(String packageName, int uid) {
     }
-    
-    public void onPackageChanged(String packageName, int uid, String[] components) {
+
+    /**
+     * Direct reflection of {@link Intent#ACTION_PACKAGE_CHANGED
+     * Intent.ACTION_PACKAGE_CHANGED} being received, informing you of
+     * changes to the enabled/disabled state of components in a package
+     * and/or of the overall package.
+     *
+     * @param packageName The name of the package that is changing.
+     * @param uid The user ID the package runs under.
+     * @param components Any components in the package that are changing.  If
+     * the overall package is changing, this will contain an entry of the
+     * package name itself.
+     * @return Return true to indicate you care about this change, which will
+     * result in {@link #onSomePackagesChanged()} being called later.  If you
+     * return false, no further callbacks will happen about this change.  The
+     * default implementation returns true if this is a change to the entire
+     * package.
+     */
+    public boolean onPackageChanged(String packageName, int uid, String[] components) {
+        if (components != null) {
+            for (String name : components) {
+                if (packageName.equals(name)) {
+                    return true;
+                }
+            }
+        }
+        return false;
     }
     
     public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
@@ -189,7 +214,10 @@
      */
     public void onPackageAppeared(String packageName, int reason) {
     }
-    
+
+    /**
+     * Called when an existing package is updated or its disabled state changes.
+     */
     public void onPackageModified(String packageName) {
     }
     
@@ -328,9 +356,10 @@
             if (pkg != null) {
                 mModifiedPackages = mTempArray;
                 mTempArray[0] = pkg;
-                onPackageChanged(pkg, uid, components);
-                // XXX Don't want this to always cause mSomePackagesChanged,
-                // since it can happen a fair amount.
+                mChangeType = PACKAGE_PERMANENT_CHANGE;
+                if (onPackageChanged(pkg, uid, components)) {
+                    mSomePackagesChanged = true;
+                }
                 onPackageModified(pkg);
             }
         } else if (Intent.ACTION_QUERY_PACKAGE_RESTART.equals(action)) {
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 4d41e42..655d148 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -59,11 +59,53 @@
                 & ApplicationInfo.FLAG_SYSTEM) != 0;
     }
 
-    public static boolean isSystemImeThatHasEnglishSubtype(InputMethodInfo imi) {
+    public static boolean isSystemImeThatHasEnglishKeyboardSubtype(InputMethodInfo imi) {
         if (!isSystemIme(imi)) {
             return false;
         }
-        return containsSubtypeOf(imi, ENGLISH_LOCALE.getLanguage());
+        return containsSubtypeOf(imi, ENGLISH_LOCALE.getLanguage(), SUBTYPE_MODE_KEYBOARD);
+    }
+
+    private static boolean isSystemAuxilialyImeThatHashAutomaticSubtype(InputMethodInfo imi) {
+        if (!isSystemIme(imi)) {
+            return false;
+        }
+        if (!imi.isAuxiliaryIme()) {
+            return false;
+        }
+        final int subtypeCount = imi.getSubtypeCount();
+        for (int i = 0; i < subtypeCount; ++i) {
+            final InputMethodSubtype s = imi.getSubtypeAt(i);
+            if (s.overridesImplicitlyEnabledSubtype()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static ArrayList<InputMethodInfo> getDefaultEnabledImes(
+            Context context, boolean isSystemReady, ArrayList<InputMethodInfo> imis) {
+        final ArrayList<InputMethodInfo> retval = new ArrayList<InputMethodInfo>();
+        boolean auxilialyImeAdded = false;
+        for (int i = 0; i < imis.size(); ++i) {
+            final InputMethodInfo imi = imis.get(i);
+            if (isDefaultEnabledIme(isSystemReady, imi, context)) {
+                retval.add(imi);
+                if (imi.isAuxiliaryIme()) {
+                    auxilialyImeAdded = true;
+                }
+            }
+        }
+        if (auxilialyImeAdded) {
+            return retval;
+        }
+        for (int i = 0; i < imis.size(); ++i) {
+            final InputMethodInfo imi = imis.get(i);
+            if (isSystemAuxilialyImeThatHashAutomaticSubtype(imi)) {
+                retval.add(imi);
+            }
+        }
+        return retval;
     }
 
     // TODO: Rename isSystemDefaultImeThatHasCurrentLanguageSubtype
@@ -77,14 +119,11 @@
         }
         if (imi.getIsDefaultResourceId() != 0) {
             try {
-                Resources res = context.createPackageContext(
-                        imi.getPackageName(), 0).getResources();
-                if (res.getBoolean(imi.getIsDefaultResourceId())
-                        && containsSubtypeOf(imi, context.getResources().getConfiguration().
-                                locale.getLanguage())) {
+                if (imi.isDefault(context) && containsSubtypeOf(
+                        imi, context.getResources().getConfiguration().locale.getLanguage(),
+                        null /* mode */)) {
                     return true;
                 }
-            } catch (PackageManager.NameNotFoundException ex) {
             } catch (Resources.NotFoundException ex) {
             }
         }
@@ -97,15 +136,19 @@
     public static boolean isDefaultEnabledIme(
             boolean isSystemReady, InputMethodInfo imi, Context context) {
         return isValidSystemDefaultIme(isSystemReady, imi, context)
-                || isSystemImeThatHasEnglishSubtype(imi);
+                || isSystemImeThatHasEnglishKeyboardSubtype(imi);
     }
 
-    private static boolean containsSubtypeOf(InputMethodInfo imi, String language) {
+    private static boolean containsSubtypeOf(InputMethodInfo imi, String language, String mode) {
         final int N = imi.getSubtypeCount();
         for (int i = 0; i < N; ++i) {
-            if (imi.getSubtypeAt(i).getLocale().startsWith(language)) {
-                return true;
+            if (!imi.getSubtypeAt(i).getLocale().startsWith(language)) {
+                continue;
             }
+            if(!TextUtils.isEmpty(mode) && !imi.getSubtypeAt(i).getMode().equalsIgnoreCase(mode)) {
+                continue;
+            }
+            return true;
         }
         return false;
     }
@@ -141,7 +184,7 @@
             while (i > 0) {
                 i--;
                 final InputMethodInfo imi = enabledImes.get(i);
-                if (InputMethodUtils.isSystemImeThatHasEnglishSubtype(imi)
+                if (InputMethodUtils.isSystemImeThatHasEnglishKeyboardSubtype(imi)
                         && !imi.isAuxiliaryIme()) {
                     return imi;
                 }
@@ -536,7 +579,7 @@
             }
         }
 
-        private String getEnabledInputMethodsStr() {
+        public String getEnabledInputMethodsStr() {
             mEnabledInputMethodsStrCache = Settings.Secure.getStringForUser(
                     mResolver, Settings.Secure.ENABLED_INPUT_METHODS, mCurrentUserId);
             if (DEBUG) {
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index d24513a..fd7e3b0 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -76,18 +76,6 @@
     private final String peerSecurityContext;
 
     /**
-     * A long-lived reference to the original command socket used to launch
-     * this peer. If "peer wait" mode is specified, the process that requested
-     * the new VM instance intends to track the lifetime of the spawned instance
-     * via the command socket. In this case, the command socket is closed
-     * in the Zygote and placed here in the spawned instance so that it will
-     * not be collected and finalized. This field remains null at all times
-     * in the original Zygote process, and in all spawned processes where
-     * "peer-wait" mode was not requested.
-     */
-    private static LocalSocket sPeerWaitSocket = null;
-
-    /**
      * Constructs instance from connected socket.
      *
      * @param socket non-null; connected socket
@@ -298,11 +286,6 @@
      *   <li> --rlimit=r,c,m<i>tuple of values for setrlimit() call.
      *    <code>r</code> is the resource, <code>c</code> and <code>m</code>
      *    are the settings for current and max value.</i>
-     *   <li> --peer-wait indicates that the command socket should
-     * be inherited by (and set to close-on-exec in) the spawned process
-     * and used to track the lifetime of that process. The spawning process
-     * then exits. Without this flag, it is retained by the spawning process
-     * (and closed in the child) in expectation of a new spawn request.
      *   <li> --classpath=<i>colon-separated classpath</i> indicates
      * that the specified class (which must b first non-flag argument) should
      * be loaded from jar files in the specified classpath. Incompatible with
@@ -330,9 +313,6 @@
         /** from --setgroups */
         int[] gids;
 
-        /** from --peer-wait */
-        boolean peerWait;
-
         /**
          * From --enable-debugger, --enable-checkjni, --enable-assert,
          * --enable-safemode, and --enable-jni-logging.
@@ -437,8 +417,6 @@
                     debugFlags |= Zygote.DEBUG_ENABLE_JNI_LOGGING;
                 } else if (arg.equals("--enable-assert")) {
                     debugFlags |= Zygote.DEBUG_ENABLE_ASSERT;
-                } else if (arg.equals("--peer-wait")) {
-                    peerWait = true;
                 } else if (arg.equals("--runtime-init")) {
                     runtimeInit = true;
                 } else if (arg.startsWith("--seinfo=")) {
@@ -897,23 +875,8 @@
             FileDescriptor[] descriptors, FileDescriptor pipeFd, PrintStream newStderr)
             throws ZygoteInit.MethodAndArgsCaller {
 
-        /*
-         * Close the socket, unless we're in "peer wait" mode, in which
-         * case it's used to track the liveness of this process.
-         */
-
-        if (parsedArgs.peerWait) {
-            try {
-                ZygoteInit.setCloseOnExec(mSocket.getFileDescriptor(), true);
-                sPeerWaitSocket = mSocket;
-            } catch (IOException ex) {
-                Log.e(TAG, "Zygote Child: error setting peer wait "
-                        + "socket to be close-on-exec", ex);
-            }
-        } else {
-            closeSocket();
-            ZygoteInit.closeServerSocket();
-        }
+        closeSocket();
+        ZygoteInit.closeServerSocket();
 
         if (descriptors != null) {
             try {
@@ -1044,18 +1007,6 @@
             return true;
         }
 
-        /*
-         * If the peer wants to use the socket to wait on the
-         * newly spawned process, then we're all done.
-         */
-        if (parsedArgs.peerWait) {
-            try {
-                mSocket.close();
-            } catch (IOException ex) {
-                Log.e(TAG, "Zygote: error closing sockets", ex);
-            }
-            return true;
-        }
         return false;
     }
 
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 9e43749..7eddc9c 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -19,10 +19,8 @@
 import static libcore.io.OsConstants.S_IRWXG;
 import static libcore.io.OsConstants.S_IRWXO;
 
-import android.content.pm.ActivityInfo;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
 import android.net.LocalServerSocket;
 import android.os.Debug;
 import android.os.Process;
@@ -88,12 +86,6 @@
     static final int GC_LOOP_COUNT = 10;
 
     /**
-     * If true, zygote forks for each peer. If false, a select loop is used
-     * inside a single process. The latter is preferred.
-     */
-    private static final boolean ZYGOTE_FORK_MODE = false;
-
-    /**
      * The name of a resource file that contains classes to preload.
      */
     private static final String PRELOADED_CLASSES = "preloaded-classes";
@@ -549,11 +541,7 @@
 
             Log.i(TAG, "Accepting command socket connections");
 
-            if (ZYGOTE_FORK_MODE) {
-                runForkMode();
-            } else {
-                runSelectLoopMode();
-            }
+            runSelectLoop();
 
             closeServerSocket();
         } catch (MethodAndArgsCaller caller) {
@@ -566,44 +554,6 @@
     }
 
     /**
-     * Runs the zygote in accept-and-fork mode. In this mode, each peer
-     * gets its own zygote spawner process. This code is retained for
-     * reference only.
-     *
-     * @throws MethodAndArgsCaller in a child process when a main() should
-     * be executed.
-     */
-    private static void runForkMode() throws MethodAndArgsCaller {
-        while (true) {
-            ZygoteConnection peer = acceptCommandPeer();
-
-            int pid;
-
-            pid = Zygote.fork();
-
-            if (pid == 0) {
-                // The child process should handle the peer requests
-
-                // The child does not accept any more connections
-                try {
-                    sServerSocket.close();
-                } catch (IOException ex) {
-                    Log.e(TAG, "Zygote Child: error closing sockets", ex);
-                } finally {
-                    sServerSocket = null;
-                }
-
-                peer.run();
-                break;
-            } else if (pid > 0) {
-                peer.closeSocket();
-            } else {
-                throw new RuntimeException("Error invoking fork()");
-            }
-        }
-    }
-
-    /**
      * Runs the zygote process's select loop. Accepts new connections as
      * they happen, and reads commands from connections one spawn-request's
      * worth at a time.
@@ -611,9 +561,9 @@
      * @throws MethodAndArgsCaller in a child process when a main() should
      * be executed.
      */
-    private static void runSelectLoopMode() throws MethodAndArgsCaller {
-        ArrayList<FileDescriptor> fds = new ArrayList();
-        ArrayList<ZygoteConnection> peers = new ArrayList();
+    private static void runSelectLoop() throws MethodAndArgsCaller {
+        ArrayList<FileDescriptor> fds = new ArrayList<FileDescriptor>();
+        ArrayList<ZygoteConnection> peers = new ArrayList<ZygoteConnection>();
         FileDescriptor[] fdArray = new FileDescriptor[4];
 
         fds.add(sServerSocket.getFileDescriptor());
@@ -734,17 +684,6 @@
             throws IOException;
 
     /**
-     * Sets the permitted and effective capability sets of this process.
-     *
-     * @param permittedCapabilities permitted set
-     * @param effectiveCapabilities effective set
-     * @throws IOException on error
-     */
-    static native void setCapabilities(
-            long permittedCapabilities,
-            long effectiveCapabilities) throws IOException;
-
-    /**
      * Invokes select() on the provider array of file descriptors (selecting
      * for readability only). Array elements of null are ignored.
      *
diff --git a/core/java/com/android/internal/util/FastXmlSerializer.java b/core/java/com/android/internal/util/FastXmlSerializer.java
index 592a8fa..99eea15 100644
--- a/core/java/com/android/internal/util/FastXmlSerializer.java
+++ b/core/java/com/android/internal/util/FastXmlSerializer.java
@@ -50,6 +50,8 @@
 
     private static final int BUFFER_LEN = 8192;
 
+    private static String sSpace = "                                                              ";
+
     private final char[] mText = new char[BUFFER_LEN];
     private int mPos;
 
@@ -59,8 +61,12 @@
     private CharsetEncoder mCharset;
     private ByteBuffer mBytes = ByteBuffer.allocate(BUFFER_LEN);
 
+    private boolean mIndent = false;
     private boolean mInTag;
 
+    private int mNesting = 0;
+    private boolean mLineStart = true;
+
     private void append(char c) throws IOException {
         int pos = mPos;
         if (pos >= (BUFFER_LEN-1)) {
@@ -113,6 +119,14 @@
         append(str, 0, str.length());
     }
 
+    private void appendIndent(int indent) throws IOException {
+        indent *= 4;
+        if (indent > sSpace.length()) {
+            indent = sSpace.length();
+        }
+        append(sSpace, 0, indent);
+    }
+
     private void escapeAndAppendString(final String string) throws IOException {
         final int N = string.length();
         final char NE = (char)ESCAPE_TABLE.length;
@@ -161,6 +175,7 @@
 
         escapeAndAppendString(value);
         append('"');
+        mLineStart = false;
         return this;
     }
 
@@ -185,9 +200,13 @@
 
     public XmlSerializer endTag(String namespace, String name) throws IOException,
             IllegalArgumentException, IllegalStateException {
+        mNesting--;
         if (mInTag) {
             append(" />\n");
         } else {
+            if (mIndent && mLineStart) {
+                appendIndent(mNesting);
+            }
             append("</");
             if (namespace != null) {
                 append(namespace);
@@ -196,6 +215,7 @@
             append(name);
             append(">\n");
         }
+        mLineStart = true;
         mInTag = false;
         return this;
     }
@@ -278,6 +298,7 @@
     public void setFeature(String name, boolean state) throws IllegalArgumentException,
             IllegalStateException {
         if (name.equals("http://xmlpull.org/v1/doc/features.html#indent-output")) {
+            mIndent = true;
             return;
         }
         throw new UnsupportedOperationException();
@@ -325,6 +346,7 @@
             IllegalArgumentException, IllegalStateException {
         append("<?xml version='1.0' encoding='utf-8' standalone='"
                 + (standalone ? "yes" : "no") + "' ?>\n");
+        mLineStart = true;
     }
 
     public XmlSerializer startTag(String namespace, String name) throws IOException,
@@ -332,6 +354,10 @@
         if (mInTag) {
             append(">\n");
         }
+        if (mIndent) {
+            appendIndent(mNesting);
+        }
+        mNesting++;
         append('<');
         if (namespace != null) {
             append(namespace);
@@ -339,6 +365,7 @@
         }
         append(name);
         mInTag = true;
+        mLineStart = false;
         return this;
     }
 
@@ -349,6 +376,9 @@
             mInTag = false;
         }
         escapeAndAppendString(buf, start, len);
+        if (mIndent) {
+            mLineStart = buf[start+len-1] == '\n';
+        }
         return this;
     }
 
@@ -359,6 +389,9 @@
             mInTag = false;
         }
         escapeAndAppendString(text);
+        if (mIndent) {
+            mLineStart = text.charAt(text.length()-1) == '\n';
+        }
         return this;
     }
 
diff --git a/core/java/com/android/internal/util/StateMachine.java b/core/java/com/android/internal/util/StateMachine.java
index 3944659..1e5a97a 100644
--- a/core/java/com/android/internal/util/StateMachine.java
+++ b/core/java/com/android/internal/util/StateMachine.java
@@ -35,7 +35,7 @@
  *
  * <p>The state machine defined here is a hierarchical state machine which processes messages
  * and can have states arranged hierarchically.</p>
- * 
+ *
  * <p>A state is a <code>State</code> object and must implement
  * <code>processMessage</code> and optionally <code>enter/exit/getName</code>.
  * The enter/exit methods are equivalent to the construction and destruction
@@ -148,7 +148,7 @@
 
     class State1 extends State {
         &#64;Override public boolean processMessage(Message message) {
-            Log.d(TAG, "Hello World");
+            log("Hello World");
             return HANDLED;
         }
     }
@@ -232,8 +232,6 @@
  * <p>The implementation is below and also in StateMachineTest:</p>
 <code>
 class Hsm1 extends StateMachine {
-    private static final String TAG = "hsm1";
-
     public static final int CMD_1 = 1;
     public static final int CMD_2 = 2;
     public static final int CMD_3 = 3;
@@ -241,16 +239,16 @@
     public static final int CMD_5 = 5;
 
     public static Hsm1 makeHsm1() {
-        Log.d(TAG, "makeHsm1 E");
+        log("makeHsm1 E");
         Hsm1 sm = new Hsm1("hsm1");
         sm.start();
-        Log.d(TAG, "makeHsm1 X");
+        log("makeHsm1 X");
         return sm;
     }
 
     Hsm1(String name) {
         super(name);
-        Log.d(TAG, "ctor E");
+        log("ctor E");
 
         // Add states, use indentation to show hierarchy
         addState(mP1);
@@ -260,16 +258,16 @@
 
         // Set the initial state
         setInitialState(mS1);
-        Log.d(TAG, "ctor X");
+        log("ctor X");
     }
 
     class P1 extends State {
         &#64;Override public void enter() {
-            Log.d(TAG, "mP1.enter");
+            log("mP1.enter");
         }
         &#64;Override public boolean processMessage(Message message) {
             boolean retVal;
-            Log.d(TAG, "mP1.processMessage what=" + message.what);
+            log("mP1.processMessage what=" + message.what);
             switch(message.what) {
             case CMD_2:
                 // CMD_2 will arrive in mS2 before CMD_3
@@ -286,16 +284,16 @@
             return retVal;
         }
         &#64;Override public void exit() {
-            Log.d(TAG, "mP1.exit");
+            log("mP1.exit");
         }
     }
 
     class S1 extends State {
         &#64;Override public void enter() {
-            Log.d(TAG, "mS1.enter");
+            log("mS1.enter");
         }
         &#64;Override public boolean processMessage(Message message) {
-            Log.d(TAG, "S1.processMessage what=" + message.what);
+            log("S1.processMessage what=" + message.what);
             if (message.what == CMD_1) {
                 // Transition to ourself to show that enter/exit is called
                 transitionTo(mS1);
@@ -306,17 +304,17 @@
             }
         }
         &#64;Override public void exit() {
-            Log.d(TAG, "mS1.exit");
+            log("mS1.exit");
         }
     }
 
     class S2 extends State {
         &#64;Override public void enter() {
-            Log.d(TAG, "mS2.enter");
+            log("mS2.enter");
         }
         &#64;Override public boolean processMessage(Message message) {
             boolean retVal;
-            Log.d(TAG, "mS2.processMessage what=" + message.what);
+            log("mS2.processMessage what=" + message.what);
             switch(message.what) {
             case(CMD_2):
                 sendMessage(obtainMessage(CMD_4));
@@ -334,17 +332,17 @@
             return retVal;
         }
         &#64;Override public void exit() {
-            Log.d(TAG, "mS2.exit");
+            log("mS2.exit");
         }
     }
 
     class P2 extends State {
         &#64;Override public void enter() {
-            Log.d(TAG, "mP2.enter");
+            log("mP2.enter");
             sendMessage(obtainMessage(CMD_5));
         }
         &#64;Override public boolean processMessage(Message message) {
-            Log.d(TAG, "P2.processMessage what=" + message.what);
+            log("P2.processMessage what=" + message.what);
             switch(message.what) {
             case(CMD_3):
                 break;
@@ -357,13 +355,13 @@
             return HANDLED;
         }
         &#64;Override public void exit() {
-            Log.d(TAG, "mP2.exit");
+            log("mP2.exit");
         }
     }
 
     &#64;Override
     void onHalting() {
-        Log.d(TAG, "halting");
+        log("halting");
         synchronized (this) {
             this.notifyAll();
         }
@@ -386,7 +384,7 @@
           // wait for the messages to be handled
           hsm.wait();
      } catch (InterruptedException e) {
-          Log.e(TAG, "exception while waiting " + e.getMessage());
+          loge("exception while waiting " + e.getMessage());
      }
 }
 </code>
@@ -418,8 +416,7 @@
 </code>
  */
 public class StateMachine {
-
-    private static final String TAG = "StateMachine";
+    // Name of the state machine and used as logging tag
     private String mName;
 
     /** Message.what value when quitting */
@@ -772,7 +769,7 @@
          */
         @Override
         public final void handleMessage(Message msg) {
-            if (mDbg) Log.d(TAG, "handleMessage: E msg.what=" + msg.what);
+            if (mDbg) mSm.log("handleMessage: E msg.what=" + msg.what);
 
             /** Save the current message */
             mMsg = msg;
@@ -793,7 +790,7 @@
             }
             performTransitions(msgProcessedState);
 
-            if (mDbg) Log.d(TAG, "handleMessage: X");
+            if (mDbg) mSm.log("handleMessage: X");
         }
 
         /**
@@ -813,7 +810,7 @@
             boolean recordLogMsg = mSm.recordLogRec(mMsg);
 
             while (mDestState != null) {
-                if (mDbg) Log.d(TAG, "handleMessage: new destination call exit");
+                if (mDbg) mSm.log("handleMessage: new destination call exit");
 
                 /**
                  * Save mDestState locally and set to null
@@ -905,7 +902,7 @@
          * Complete the construction of the state machine.
          */
         private final void completeConstruction() {
-            if (mDbg) Log.d(TAG, "completeConstruction: E");
+            if (mDbg) mSm.log("completeConstruction: E");
 
             /**
              * Determine the maximum depth of the state hierarchy
@@ -921,7 +918,7 @@
                     maxDepth = depth;
                 }
             }
-            if (mDbg) Log.d(TAG, "completeConstruction: maxDepth=" + maxDepth);
+            if (mDbg) mSm.log("completeConstruction: maxDepth=" + maxDepth);
 
             mStateStack = new StateInfo[maxDepth];
             mTempStateStack = new StateInfo[maxDepth];
@@ -930,7 +927,7 @@
             /** Sending SM_INIT_CMD message to invoke enter methods asynchronously */
             sendMessageAtFrontOfQueue(obtainMessage(SM_INIT_CMD, mSmHandlerObj));
 
-            if (mDbg) Log.d(TAG, "completeConstruction: X");
+            if (mDbg) mSm.log("completeConstruction: X");
         }
 
         /**
@@ -942,7 +939,7 @@
         private final State processMsg(Message msg) {
             StateInfo curStateInfo = mStateStack[mStateStackTopIndex];
             if (mDbg) {
-                Log.d(TAG, "processMsg: " + curStateInfo.state.getName());
+                mSm.log("processMsg: " + curStateInfo.state.getName());
             }
 
             if (isQuit(msg)) {
@@ -961,7 +958,7 @@
                         break;
                     }
                     if (mDbg) {
-                        Log.d(TAG, "processMsg: " + curStateInfo.state.getName());
+                        mSm.log("processMsg: " + curStateInfo.state.getName());
                     }
                 }
            }
@@ -976,7 +973,7 @@
             while ((mStateStackTopIndex >= 0) &&
                     (mStateStack[mStateStackTopIndex] != commonStateInfo)) {
                 State curState = mStateStack[mStateStackTopIndex].state;
-                if (mDbg) Log.d(TAG, "invokeExitMethods: " + curState.getName());
+                if (mDbg) mSm.log("invokeExitMethods: " + curState.getName());
                 curState.exit();
                 mStateStack[mStateStackTopIndex].active = false;
                 mStateStackTopIndex -= 1;
@@ -988,7 +985,7 @@
          */
         private final void invokeEnterMethods(int stateStackEnteringIndex) {
             for (int i = stateStackEnteringIndex; i <= mStateStackTopIndex; i++) {
-                if (mDbg) Log.d(TAG, "invokeEnterMethods: " + mStateStack[i].state.getName());
+                if (mDbg) mSm.log("invokeEnterMethods: " + mStateStack[i].state.getName());
                 mStateStack[i].state.enter();
                 mStateStack[i].active = true;
             }
@@ -1006,7 +1003,7 @@
              */
             for (int i = mDeferredMessages.size() - 1; i >= 0; i-- ) {
                 Message curMsg = mDeferredMessages.get(i);
-                if (mDbg) Log.d(TAG, "moveDeferredMessageAtFrontOfQueue; what=" + curMsg.what);
+                if (mDbg) mSm.log("moveDeferredMessageAtFrontOfQueue; what=" + curMsg.what);
                 sendMessageAtFrontOfQueue(curMsg);
             }
             mDeferredMessages.clear();
@@ -1024,7 +1021,7 @@
             int i = mTempStateStackCount - 1;
             int j = startingIndex;
             while (i >= 0) {
-                if (mDbg) Log.d(TAG, "moveTempStackToStateStack: i=" + i + ",j=" + j);
+                if (mDbg) mSm.log("moveTempStackToStateStack: i=" + i + ",j=" + j);
                 mStateStack[j] = mTempStateStack[i];
                 j += 1;
                 i -= 1;
@@ -1032,7 +1029,7 @@
 
             mStateStackTopIndex = j - 1;
             if (mDbg) {
-                Log.d(TAG, "moveTempStackToStateStack: X mStateStackTop="
+                mSm.log("moveTempStackToStateStack: X mStateStackTop="
                       + mStateStackTopIndex + ",startingIndex=" + startingIndex
                       + ",Top=" + mStateStack[mStateStackTopIndex].state.getName());
             }
@@ -1065,7 +1062,7 @@
             } while ((curStateInfo != null) && !curStateInfo.active);
 
             if (mDbg) {
-                Log.d(TAG, "setupTempStateStackWithStatesToEnter: X mTempStateStackCount="
+                mSm.log("setupTempStateStackWithStatesToEnter: X mTempStateStackCount="
                       + mTempStateStackCount + ",curStateInfo: " + curStateInfo);
             }
             return curStateInfo;
@@ -1076,7 +1073,7 @@
          */
         private final void setupInitialStateStack() {
             if (mDbg) {
-                Log.d(TAG, "setupInitialStateStack: E mInitialState="
+                mSm.log("setupInitialStateStack: E mInitialState="
                     + mInitialState.getName());
             }
 
@@ -1117,7 +1114,7 @@
          */
         private final StateInfo addState(State state, State parent) {
             if (mDbg) {
-                Log.d(TAG, "addStateInternal: E state=" + state.getName()
+                mSm.log("addStateInternal: E state=" + state.getName()
                         + ",parent=" + ((parent == null) ? "" : parent.getName()));
             }
             StateInfo parentStateInfo = null;
@@ -1142,7 +1139,7 @@
             stateInfo.state = state;
             stateInfo.parentStateInfo = parentStateInfo;
             stateInfo.active = false;
-            if (mDbg) Log.d(TAG, "addStateInternal: X stateInfo: " + stateInfo);
+            if (mDbg) mSm.log("addStateInternal: X stateInfo: " + stateInfo);
             return stateInfo;
         }
 
@@ -1162,19 +1159,19 @@
 
         /** @see StateMachine#setInitialState(State) */
         private final void setInitialState(State initialState) {
-            if (mDbg) Log.d(TAG, "setInitialState: initialState=" + initialState.getName());
+            if (mDbg) mSm.log("setInitialState: initialState=" + initialState.getName());
             mInitialState = initialState;
         }
 
         /** @see StateMachine#transitionTo(IState) */
         private final void transitionTo(IState destState) {
             mDestState = (State) destState;
-            if (mDbg) Log.d(TAG, "transitionTo: destState=" + mDestState.getName());
+            if (mDbg) mSm.log("transitionTo: destState=" + mDestState.getName());
         }
 
         /** @see StateMachine#deferMessage(Message) */
         private final void deferMessage(Message msg) {
-            if (mDbg) Log.d(TAG, "deferMessage: msg=" + msg.what);
+            if (mDbg) mSm.log("deferMessage: msg=" + msg.what);
 
             /* Copy the "msg" to "newMsg" as "msg" will be recycled */
             Message newMsg = obtainMessage();
@@ -1185,17 +1182,17 @@
 
         /** @see StateMachine#quit() */
         private final void quit() {
-            if (mDbg) Log.d(TAG, "quit:");
+            if (mDbg) mSm.log("quit:");
             sendMessage(obtainMessage(SM_QUIT_CMD, mSmHandlerObj));
         }
 
         /** @see StateMachine#quitNow() */
         private final void quitNow() {
-            if (mDbg) Log.d(TAG, "abort:");
+            if (mDbg) mSm.log("quitNow:");
             sendMessageAtFrontOfQueue(obtainMessage(SM_QUIT_CMD, mSmHandlerObj));
         }
 
-        /** Validate that the message was sent by quit or abort. */
+        /** Validate that the message was sent by quit or quitNow. */
         private final boolean isQuit(Message msg) {
             return (msg.what == SM_QUIT_CMD) && (msg.obj == mSmHandlerObj);
         }
@@ -1337,7 +1334,7 @@
      * @param msg that couldn't be handled.
      */
     protected void unhandledMessage(Message msg) {
-        if (mSmHandler.mDbg) Log.e(TAG, mName + " - unhandledMessage: msg.what=" + msg.what);
+        if (mSmHandler.mDbg) loge(" - unhandledMessage: msg.what=" + msg.what);
     }
 
     /**
@@ -1696,4 +1693,28 @@
         }
         pw.println("curState=" + getCurrentState().getName());
     }
+
+    protected void log(String s) {
+        Log.d(mName, s);
+    }
+
+    protected void logv(String s) {
+        Log.v(mName, s);
+    }
+
+    protected void logi(String s) {
+        Log.i(mName, s);
+    }
+
+    protected void logd(String s) {
+        Log.d(mName, s);
+    }
+
+    protected void logw(String s) {
+        Log.w(mName, s);
+    }
+
+    protected void loge(String s) {
+        Log.e(mName, s);
+    }
 }
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 8ccc612..560227d 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -40,6 +40,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.text.Layout;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -49,7 +50,6 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
-import android.view.TouchDelegate;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewParent;
@@ -83,7 +83,8 @@
             ActionBar.DISPLAY_USE_LOGO |
             ActionBar.DISPLAY_HOME_AS_UP |
             ActionBar.DISPLAY_SHOW_CUSTOM |
-            ActionBar.DISPLAY_SHOW_TITLE;
+            ActionBar.DISPLAY_SHOW_TITLE |
+            ActionBar.DISPLAY_TITLE_MULTIPLE_LINES;
 
     private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.START | Gravity.CENTER_VERTICAL;
     
@@ -100,6 +101,7 @@
     private TextView mTitleView;
     private TextView mSubtitleView;
     private View mTitleUpView;
+    private ViewGroup mUpGoerFive;
 
     private Spinner mSpinner;
     private LinearLayout mListNavLayout;
@@ -137,10 +139,6 @@
 
     Window.Callback mWindowCallback;
 
-    private final Rect mTempRect = new Rect();
-    private int mMaxHomeSlop;
-    private static final int MAX_HOME_SLOP = 32; // dp
-
     private final AdapterView.OnItemSelectedListener mNavItemSelectedListener =
             new AdapterView.OnItemSelectedListener() {
         public void onItemSelected(AdapterView parent, View view, int position, long id) {
@@ -219,9 +217,11 @@
                 com.android.internal.R.styleable.ActionBar_homeLayout,
                 com.android.internal.R.layout.action_bar_home);
 
-        mHomeLayout = (HomeView) inflater.inflate(homeResId, this, false);
+        mUpGoerFive = (ViewGroup) inflater.inflate(
+                com.android.internal.R.layout.action_bar_up_container, this, false);
+        mHomeLayout = (HomeView) inflater.inflate(homeResId, mUpGoerFive, false);
 
-        mExpandedHomeLayout = (HomeView) inflater.inflate(homeResId, this, false);
+        mExpandedHomeLayout = (HomeView) inflater.inflate(homeResId, mUpGoerFive, false);
         mExpandedHomeLayout.setUp(true);
         mExpandedHomeLayout.setOnClickListener(mExpandedActionViewUpListener);
         mExpandedHomeLayout.setContentDescription(getResources().getText(
@@ -250,16 +250,14 @@
         a.recycle();
         
         mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle);
-        mHomeLayout.setOnClickListener(mUpClickListener);
-        mHomeLayout.setClickable(true);
-        mHomeLayout.setFocusable(true);
+
+        mUpGoerFive.setOnClickListener(mUpClickListener);
+        mUpGoerFive.setClickable(true);
+        mUpGoerFive.setFocusable(true);
 
         if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
             setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
         }
-
-        mMaxHomeSlop =
-                (int) (MAX_HOME_SLOP * context.getResources().getDisplayMetrics().density + 0.5f);
     }
 
     @Override
@@ -269,8 +267,8 @@
         mTitleView = null;
         mSubtitleView = null;
         mTitleUpView = null;
-        if (mTitleLayout != null && mTitleLayout.getParent() == this) {
-            removeView(mTitleLayout);
+        if (mTitleLayout != null && mTitleLayout.getParent() == mUpGoerFive) {
+            mUpGoerFive.removeView(mTitleLayout);
         }
         mTitleLayout = null;
         if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
@@ -551,19 +549,19 @@
     }
 
     public void setHomeButtonEnabled(boolean enable) {
-        mHomeLayout.setEnabled(enable);
-        mHomeLayout.setFocusable(enable);
+        mUpGoerFive.setEnabled(enable);
+        mUpGoerFive.setFocusable(enable);
         // Make sure the home button has an accurate content description for accessibility.
         if (!enable) {
-            mHomeLayout.setContentDescription(null);
-            mHomeLayout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
+            mUpGoerFive.setContentDescription(null);
+            mUpGoerFive.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
         } else {
-            mHomeLayout.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_AUTO);
+            mUpGoerFive.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_AUTO);
             if ((mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
-                mHomeLayout.setContentDescription(mContext.getResources().getText(
+                mUpGoerFive.setContentDescription(mContext.getResources().getText(
                         R.string.action_bar_up_description));
             } else {
-                mHomeLayout.setContentDescription(mContext.getResources().getText(
+                mUpGoerFive.setContentDescription(mContext.getResources().getText(
                         R.string.action_bar_home_description));
             }
         }
@@ -600,7 +598,7 @@
                 if ((options & ActionBar.DISPLAY_SHOW_TITLE) != 0) {
                     initTitle();
                 } else {
-                    removeView(mTitleLayout);
+                    mUpGoerFive.removeView(mTitleLayout);
                 }
             }
 
@@ -608,8 +606,6 @@
                     (ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME)) != 0) {
                 final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0;
                 mTitleUpView.setVisibility(!showHome ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE);
-                mTitleLayout.setEnabled(!showHome && homeAsUp);
-                mTitleLayout.setClickable(!showHome && homeAsUp);
             }
 
             if ((flagsChanged & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) {
@@ -620,6 +616,17 @@
                 }
             }
             
+            if (mTitleLayout != null &&
+                    (flagsChanged & ActionBar.DISPLAY_TITLE_MULTIPLE_LINES) != 0) {
+                if ((options & ActionBar.DISPLAY_TITLE_MULTIPLE_LINES) != 0) {
+                    mTitleView.setSingleLine(false);
+                    mTitleView.setMaxLines(2);
+                } else {
+                    mTitleView.setMaxLines(1);
+                    mTitleView.setSingleLine(true);
+                }
+            }
+
             requestLayout();
         } else {
             invalidate();
@@ -754,7 +761,8 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
 
-        addView(mHomeLayout);
+        mUpGoerFive.addView(mHomeLayout, 0);
+        addView(mUpGoerFive);
 
         if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) {
             final ViewParent parent = mCustomNavView.getParent();
@@ -776,8 +784,6 @@
             mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle);
             mTitleUpView = (View) mTitleLayout.findViewById(R.id.up);
 
-            mTitleLayout.setOnClickListener(mUpClickListener);
-
             if (mTitleStyleRes != 0) {
                 mTitleView.setTextAppearance(mContext, mTitleStyleRes);
             }
@@ -797,11 +803,9 @@
             final boolean showHome = (mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0;
             final boolean showTitleUp = !showHome;
             mTitleUpView.setVisibility(showTitleUp ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE);
-            mTitleLayout.setEnabled(homeAsUp && showTitleUp);
-            mTitleLayout.setClickable(homeAsUp && showTitleUp);
         }
 
-        addView(mTitleLayout);
+        mUpGoerFive.addView(mTitleLayout);
         if (mExpandedActionView != null ||
                 (TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mSubtitle))) {
             // Don't show while in expanded mode or with empty text
@@ -821,6 +825,28 @@
         return mIsCollapsed;
     }
 
+    /**
+     * @return True if any characters in the title were truncated
+     */
+    public boolean isTitleTruncated() {
+        if (mTitleView == null) {
+            return false;
+        }
+
+        final Layout titleLayout = mTitleView.getLayout();
+        if (titleLayout == null) {
+            return false;
+        }
+
+        final int lineCount = titleLayout.getLineCount();
+        for (int i = 0; i < lineCount; i++) {
+            if (titleLayout.getEllipsisCount(i) > 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         final int childCount = getChildCount();
@@ -829,7 +855,16 @@
             for (int i = 0; i < childCount; i++) {
                 final View child = getChildAt(i);
                 if (child.getVisibility() != GONE &&
-                        !(child == mMenuView && mMenuView.getChildCount() == 0)) {
+                        !(child == mMenuView && mMenuView.getChildCount() == 0) &&
+                        child != mUpGoerFive) {
+                    visibleChildren++;
+                }
+            }
+
+            final int upChildCount = mUpGoerFive.getChildCount();
+            for (int i = 0; i < upChildCount; i++) {
+                final View child = mUpGoerFive.getChildAt(i);
+                if (child.getVisibility() != GONE) {
                     visibleChildren++;
                 }
             }
@@ -873,7 +908,8 @@
 
         HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout;
 
-        if (homeLayout.getVisibility() != GONE) {
+        int homeWidth = 0;
+        if (homeLayout.getVisibility() != GONE && homeLayout.getParent() == mUpGoerFive) {
             final ViewGroup.LayoutParams lp = homeLayout.getLayoutParams();
             int homeWidthSpec;
             if (lp.width < 0) {
@@ -881,10 +917,18 @@
             } else {
                 homeWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
             }
+
+            /*
+             * This is a little weird.
+             * We're only measuring the *home* affordance within the Up container here
+             * on purpose, because we want to give the available space to all other views before
+             * the title text. We'll remeasure the whole up container again later.
+             */
             homeLayout.measure(homeWidthSpec, exactHeightSpec);
-            final int homeWidth = homeLayout.getMeasuredWidth() + homeLayout.getStartOffset();
-            availableWidth = Math.max(0, availableWidth - homeWidth);
-            leftOfCenter = Math.max(0, availableWidth - homeWidth);
+            homeWidth = homeLayout.getMeasuredWidth();
+            final int homeOffsetWidth = homeWidth + homeLayout.getStartOffset();
+            availableWidth = Math.max(0, availableWidth - homeOffsetWidth);
+            leftOfCenter = Math.max(0, availableWidth - homeOffsetWidth);
         }
         
         if (mMenuView != null && mMenuView.getParent() == this) {
@@ -986,9 +1030,13 @@
             availableWidth -= horizontalMargin + customView.getMeasuredWidth();
         }
 
-        if (mExpandedActionView == null && showTitle) {
-            availableWidth = measureChildView(mTitleLayout, availableWidth,
-                    MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY), 0);
+        /*
+         * Measure the whole up container now, allowing for the full home+title sections.
+         * (This will re-measure the home view.)
+         */
+        availableWidth = measureChildView(mUpGoerFive, availableWidth + homeWidth,
+                MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY), 0);
+        if (mTitleLayout != null) {
             leftOfCenter = Math.max(0, leftOfCenter - mTitleLayout.getMeasuredWidth());
         }
 
@@ -1035,25 +1083,17 @@
         final int y = getPaddingTop();
 
         HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout;
-        boolean needsTouchDelegate = false;
-        int homeSlop = mMaxHomeSlop;
-        int homeRight = 0;
-        if (homeLayout.getVisibility() != GONE) {
-            final int startOffset = homeLayout.getStartOffset();
-            x += positionChild(homeLayout,
-                            next(x, startOffset, isLayoutRtl), y, contentHeight, isLayoutRtl);
-            x = next(x, startOffset, isLayoutRtl);
-            needsTouchDelegate = homeLayout == mHomeLayout;
-            homeRight = x;
-        }
+        final int startOffset = homeLayout.getVisibility() != GONE &&
+                homeLayout.getParent() == mUpGoerFive ? homeLayout.getStartOffset() : 0;
+
+        // Position the up container based on where the edge of the home layout should go.
+        x += positionChild(mUpGoerFive,
+                next(x, startOffset, isLayoutRtl), y, contentHeight, isLayoutRtl);
+        x = next(x, startOffset, isLayoutRtl);
 
         if (mExpandedActionView == null) {
             final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE &&
                     (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;
-            if (showTitle) {
-                x += positionChild(mTitleLayout, x, y, contentHeight, isLayoutRtl);
-                homeSlop = mTitleLayout.getWidth();
-            }
 
             switch (mNavigationMode) {
                 case ActionBar.NAVIGATION_MODE_STANDARD:
@@ -1063,7 +1103,6 @@
                         if (showTitle) {
                             x = next(x, mItemPadding, isLayoutRtl);
                         }
-                        homeSlop = Math.min(homeSlop, Math.max(x - homeRight, 0));
                         x += positionChild(mListNavLayout, x, y, contentHeight, isLayoutRtl);
                         x = next(x, mItemPadding, isLayoutRtl);
                     }
@@ -1071,7 +1110,6 @@
                 case ActionBar.NAVIGATION_MODE_TABS:
                     if (mTabScrollView != null) {
                         if (showTitle) x = next(x, mItemPadding, isLayoutRtl);
-                        homeSlop = Math.min(homeSlop, Math.max(x - homeRight, 0));
                         x += positionChild(mTabScrollView, x, y, contentHeight, isLayoutRtl);
                         x = next(x, mItemPadding, isLayoutRtl);
                     }
@@ -1176,7 +1214,6 @@
             final int customWidth = customView.getMeasuredWidth();
             customView.layout(xpos, ypos, xpos + customWidth,
                     ypos + customView.getMeasuredHeight());
-            homeSlop = Math.min(homeSlop, Math.max(xpos - homeRight, 0));
             x = next(x, customWidth, isLayoutRtl);
         }
 
@@ -1186,14 +1223,6 @@
             mProgressView.layout(mProgressBarPadding, -halfProgressHeight,
                     mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight);
         }
-
-        if (needsTouchDelegate) {
-            mTempRect.set(homeLayout.getLeft(), homeLayout.getTop(),
-                    homeLayout.getRight() + homeSlop, homeLayout.getBottom());
-            setTouchDelegate(new TouchDelegate(mTempRect, homeLayout));
-        } else {
-            setTouchDelegate(null);
-        }
     }
 
     @Override
@@ -1493,8 +1522,8 @@
             if (mExpandedActionView.getParent() != ActionBarView.this) {
                 addView(mExpandedActionView);
             }
-            if (mExpandedHomeLayout.getParent() != ActionBarView.this) {
-                addView(mExpandedHomeLayout);
+            if (mExpandedHomeLayout.getParent() != mUpGoerFive) {
+                mUpGoerFive.addView(mExpandedHomeLayout);
             }
             mHomeLayout.setVisibility(GONE);
             if (mTitleLayout != null) mTitleLayout.setVisibility(GONE);
@@ -1520,7 +1549,7 @@
             }
 
             removeView(mExpandedActionView);
-            removeView(mExpandedHomeLayout);
+            mUpGoerFive.removeView(mExpandedHomeLayout);
             mExpandedActionView = null;
             if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0) {
                 mHomeLayout.setVisibility(VISIBLE);
diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp
index a4dcac6..7540645 100644
--- a/core/jni/android_os_MessageQueue.cpp
+++ b/core/jni/android_os_MessageQueue.cpp
@@ -109,55 +109,34 @@
 
 // ----------------------------------------------------------------------------
 
-static NativeMessageQueue* android_os_MessageQueue_getNativeMessageQueue(JNIEnv* env,
-        jobject messageQueueObj) {
+sp<MessageQueue> android_os_MessageQueue_getMessageQueue(JNIEnv* env, jobject messageQueueObj) {
     jint intPtr = env->GetIntField(messageQueueObj, gMessageQueueClassInfo.mPtr);
     return reinterpret_cast<NativeMessageQueue*>(intPtr);
 }
 
-static void android_os_MessageQueue_setNativeMessageQueue(JNIEnv* env, jobject messageQueueObj,
-        NativeMessageQueue* nativeMessageQueue) {
-    env->SetIntField(messageQueueObj, gMessageQueueClassInfo.mPtr,
-             reinterpret_cast<jint>(nativeMessageQueue));
-}
-
-sp<MessageQueue> android_os_MessageQueue_getMessageQueue(JNIEnv* env, jobject messageQueueObj) {
-    NativeMessageQueue* nativeMessageQueue =
-            android_os_MessageQueue_getNativeMessageQueue(env, messageQueueObj);
-    return nativeMessageQueue;
-}
-
-static void android_os_MessageQueue_nativeInit(JNIEnv* env, jobject obj) {
+static jint android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) {
     NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();
     if (!nativeMessageQueue) {
         jniThrowRuntimeException(env, "Unable to allocate native queue");
-        return;
+        return 0;
     }
 
     nativeMessageQueue->incStrong(env);
-    android_os_MessageQueue_setNativeMessageQueue(env, obj, nativeMessageQueue);
+    return reinterpret_cast<jint>(nativeMessageQueue);
 }
 
-static void android_os_MessageQueue_nativeDestroy(JNIEnv* env, jobject obj) {
-    NativeMessageQueue* nativeMessageQueue =
-            android_os_MessageQueue_getNativeMessageQueue(env, obj);
-    if (nativeMessageQueue) {
-        android_os_MessageQueue_setNativeMessageQueue(env, obj, NULL);
-        nativeMessageQueue->decStrong(env);
-    }
+static void android_os_MessageQueue_nativeDestroy(JNIEnv* env, jclass clazz, jint ptr) {
+    NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr);
+    nativeMessageQueue->decStrong(env);
 }
 
-static void throwQueueNotInitialized(JNIEnv* env) {
-    jniThrowException(env, "java/lang/IllegalStateException", "Message queue not initialized");
-}
-
-static void android_os_MessageQueue_nativePollOnce(JNIEnv* env, jobject obj,
+static void android_os_MessageQueue_nativePollOnce(JNIEnv* env, jclass clazz,
         jint ptr, jint timeoutMillis) {
     NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr);
     nativeMessageQueue->pollOnce(env, timeoutMillis);
 }
 
-static void android_os_MessageQueue_nativeWake(JNIEnv* env, jobject obj, jint ptr) {
+static void android_os_MessageQueue_nativeWake(JNIEnv* env, jclass clazz, jint ptr) {
     NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr);
     return nativeMessageQueue->wake();
 }
@@ -166,8 +145,8 @@
 
 static JNINativeMethod gMessageQueueMethods[] = {
     /* name, signature, funcPtr */
-    { "nativeInit", "()V", (void*)android_os_MessageQueue_nativeInit },
-    { "nativeDestroy", "()V", (void*)android_os_MessageQueue_nativeDestroy },
+    { "nativeInit", "()I", (void*)android_os_MessageQueue_nativeInit },
+    { "nativeDestroy", "(I)V", (void*)android_os_MessageQueue_nativeDestroy },
     { "nativePollOnce", "(II)V", (void*)android_os_MessageQueue_nativePollOnce },
     { "nativeWake", "(I)V", (void*)android_os_MessageQueue_nativeWake }
 };
diff --git a/core/jni/com_android_internal_os_ZygoteInit.cpp b/core/jni/com_android_internal_os_ZygoteInit.cpp
index 7e5dede..bc8c4a7 100644
--- a/core/jni/com_android_internal_os_ZygoteInit.cpp
+++ b/core/jni/com_android_internal_os_ZygoteInit.cpp
@@ -163,32 +163,6 @@
     }
 }
 
-static void com_android_internal_os_ZygoteInit_setCapabilities (JNIEnv *env,
-    jobject clazz, jlong permitted, jlong effective)
-{
-    struct __user_cap_header_struct capheader;
-    struct __user_cap_data_struct capdata;
-    int err;
-
-    memset (&capheader, 0, sizeof(capheader));
-    memset (&capdata, 0, sizeof(capdata));
-
-    capheader.version = _LINUX_CAPABILITY_VERSION;
-    capheader.pid = 0;
-
-    // As of this writing, capdata is __u32, but that's expected
-    // to change...
-    capdata.effective = effective;
-    capdata.permitted = permitted;
-
-    err = capset (&capheader, &capdata);
-
-    if (err < 0) {
-        jniThrowIOException(env, errno);
-        return;
-    }
-}
-
 static jlong com_android_internal_os_ZygoteInit_capgetPermitted (JNIEnv *env,
     jobject clazz, jint pid)
 {
@@ -304,8 +278,6 @@
             (void *) com_android_internal_os_ZygoteInit_reopenStdio},
     { "setCloseOnExec", "(Ljava/io/FileDescriptor;Z)V",
         (void *)  com_android_internal_os_ZygoteInit_setCloseOnExec},
-    { "setCapabilities", "(JJ)V",
-        (void *) com_android_internal_os_ZygoteInit_setCapabilities },
     { "capgetPermitted", "(I)J",
         (void *) com_android_internal_os_ZygoteInit_capgetPermitted },
     { "selectReadable", "([Ljava/io/FileDescriptor;)I",
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index a69870b..558080c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -690,6 +690,12 @@
         android:permissionGroup="android.permission-group.NETWORK"
         android:protectionLevel="signature|system" />
 
+    <!-- Allows access to the loop radio (Android@Home mesh network) device.
+	@hide -->
+    <permission android:name="android.permission.LOOP_RADIO"
+	android:permissionGroup="android.permission-group.NETWORK"
+	android:protectionLevel="signature|system" />
+    
     <!-- ================================== -->
     <!-- Permissions for accessing accounts -->
     <!-- ================================== -->
@@ -1702,6 +1708,13 @@
         android:description="@string/permdesc_stopAppSwitches"
         android:protectionLevel="signature|system" />
 
+    <!-- Allows an application to retrieve private information about
+         the current top activity, such as any assist context it can provide. -->
+    <permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"
+        android:label="@string/permlab_getTopActivityInfo"
+        android:description="@string/permdesc_getTopActivityInfo"
+        android:protectionLevel="signature" />
+
     <!-- Allows an application to retrieve the current state of keys and
          switches.  This is only for use by the system.
          @deprecated The API that used this permission has been removed. -->
diff --git a/core/res/res/layout-xlarge/screen_action_bar.xml b/core/res/res/layout-xlarge/screen_action_bar.xml
index 751d322..0b6122d 100644
--- a/core/res/res/layout-xlarge/screen_action_bar.xml
+++ b/core/res/res/layout-xlarge/screen_action_bar.xml
@@ -20,7 +20,8 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
-    android:fitsSystemWindows="true">
+    android:fitsSystemWindows="true"
+    android:splitMotionEvents="false">
     <com.android.internal.widget.ActionBarContainer android:id="@+id/action_bar_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/core/res/res/layout-xlarge/screen_action_bar_overlay.xml b/core/res/res/layout-xlarge/screen_action_bar_overlay.xml
index f2a1ea1..a95635e 100644
--- a/core/res/res/layout-xlarge/screen_action_bar_overlay.xml
+++ b/core/res/res/layout-xlarge/screen_action_bar_overlay.xml
@@ -23,7 +23,8 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/action_bar_overlay_layout"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:splitMotionEvents="false">
     <FrameLayout android:id="@android:id/content"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
diff --git a/core/res/res/layout/action_bar_home.xml b/core/res/res/layout/action_bar_home.xml
index fe58215..5341f3d 100644
--- a/core/res/res/layout/action_bar_home.xml
+++ b/core/res/res/layout/action_bar_home.xml
@@ -17,9 +17,7 @@
 <view xmlns:android="http://schemas.android.com/apk/res/android"
       class="com.android.internal.widget.ActionBarView$HomeView"
       android:layout_width="wrap_content"
-      android:layout_height="match_parent"
-      android:background="?android:attr/actionBarItemBackground"
-      android:animateLayoutChanges="true">
+      android:layout_height="match_parent">
     <ImageView android:id="@android:id/up"
                android:src="?android:attr/homeAsUpIndicator"
                android:layout_gravity="center_vertical|start"
diff --git a/core/res/res/layout/action_bar_title_item.xml b/core/res/res/layout/action_bar_title_item.xml
index df773eb..ccc5b07 100644
--- a/core/res/res/layout/action_bar_title_item.xml
+++ b/core/res/res/layout/action_bar_title_item.xml
@@ -16,10 +16,9 @@
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
+              android:layout_height="match_parent"
               android:orientation="horizontal"
               android:paddingEnd="8dip"
-              android:background="?android:attr/actionBarItemBackground"
               android:enabled="false">
 
     <ImageView android:id="@android:id/up"
diff --git a/core/res/res/layout/action_bar_up_container.xml b/core/res/res/layout/action_bar_up_container.xml
new file mode 100644
index 0000000..c6fad64
--- /dev/null
+++ b/core/res/res/layout/action_bar_up_container.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+      android:layout_width="wrap_content"
+      android:layout_height="match_parent"
+      android:background="?android:attr/actionBarItemBackground"
+      android:gravity="center_vertical"
+      android:enabled="false">
+</LinearLayout>
diff --git a/core/res/res/layout/screen_action_bar.xml b/core/res/res/layout/screen_action_bar.xml
index b0f1bc5..f0b2313 100644
--- a/core/res/res/layout/screen_action_bar.xml
+++ b/core/res/res/layout/screen_action_bar.xml
@@ -22,7 +22,8 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:fitsSystemWindows="true">
+    android:fitsSystemWindows="true"
+    android:splitMotionEvents="false">
     <com.android.internal.widget.ActionBarContainer android:id="@+id/action_bar_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/core/res/res/layout/screen_action_bar_overlay.xml b/core/res/res/layout/screen_action_bar_overlay.xml
index 20a7db1..c8181d1 100644
--- a/core/res/res/layout/screen_action_bar_overlay.xml
+++ b/core/res/res/layout/screen_action_bar_overlay.xml
@@ -23,7 +23,8 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/action_bar_overlay_layout"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:splitMotionEvents="false">
     <FrameLayout android:id="@android:id/content"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
diff --git a/core/res/res/layout/search_view.xml b/core/res/res/layout/search_view.xml
index a281fcc..29c0576 100644
--- a/core/res/res/layout/search_view.xml
+++ b/core/res/res/layout/search_view.xml
@@ -45,6 +45,7 @@
         android:layout_height="match_parent"
         android:layout_gravity="center_vertical"
         android:src="?android:attr/searchViewSearchIcon"
+        android:focusable="true"
         android:contentDescription="@string/searchview_description_search"
     />
 
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index ad64eb6..0639da8 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -299,6 +299,8 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Plaas die aktiwiteitbestuurder in \'n afsluitingstatus. Doen nie \'n volledige afsluiting nie."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"verhoed program-oorskakelings"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Verhoed dat die gebruiker na \'n ander program oorskakel."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"kry huidige program-inligting"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Laat die houer toe om private inligting oor die huidige program op die voorgrond van die skerm te herwin."</string>
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitor en beheer alle programlaaiery"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Laat die program toe om te monitor en te beheer hoe die stelsel aktiwiteite laai. Kwaadwillige programme kan dalk die stelsel heeltemal in gevaar stel. Hierdie toestemming is net nodig vir ontwikkeling, en nooit vir normale gebruik nie."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"stuur uitsending met pakket verwyder"</string>
@@ -315,6 +317,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Laat \'n program toe om die huidige lae-vlak batteryverbruikdata te lees. Kan die program toelaat om gedetailleerde inligting te vind oor watter programme jy gebruik."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"verander batterystatistieke"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Laat die program toe om versamelde battery-statistieke te verander. Nie vir gebruik deur normale programme nie."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"haal programwerking-statistieke op"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Laat die program toe om versamelde programwerking-statistieke te herwin. Nie vir gebruik deur normale programme nie."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"verander programwerking-statistieke"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Laat die program toe om versamelde programwerking-statistieke te verander. Nie vir gebruik deur normale programme nie."</string>
     <string name="permlab_backup" msgid="470013022865453920">"beheerstelsel-rugsteun en -teruglaai"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 9fa0a06..f0ad4bf 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"የእንቅስቃሴውን አደራጅ ወደ ዝጋ ሁነታ አስቀምጥ።ሙሉ ለሙሉ ዝጋ አያከናውንም።"</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"የትግበራ መቀያየርን ተከላከል"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"ተጠቃሚው ከሌላ መተግበሪያ ከመቀየር ይከላከላል።"</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"ሁሉንም መተግበሪያ ማስነሻ አሳይ እና ተቆጣጠር"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"እንቅስቃሴዎችን ስርዓቱ እንዴት እንደሚያስጀምር ለመከታተል እና ለመቆጣጠር ለመተግበሪያው ይፈቅዳሉ፡፡ ተንኮል አዘል መተግበሪያዎች የስርዓቱን ክብረ ገመና ሙሉለሙሉ ሊያጋልጡ ይችላሉ፡፡ ይህ ፍቃድ የሚያስፈልገው ለግንባታ ብቻ ነው፤ ለመደበኛ አጠቃቀም ፈጽሞ አይደለም፡፡"</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"አካታች የተወገደለት ስርጭት ላክ"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"አንድ መተግበሪያ የአሁኑን የዝቅተኛ-ደረጃ ባትሪ አጠቃቀም ውሂብን እንዲያነብ ያስችላል። መተግበሪያው ስለሚጠቀሟቸው መተግበሪያዎች ዝርዝር መረጃ እንዲያገኝ ሊያስችለው ይችላል።"</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"የባትሪ ስታስቲክስን ይቀይራል"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"የተሰበሰቡ የባትሪ  ስታስቲክሶችን እንዲቀይር ለመተግበሪያው ያስችለዋል። ለመደበኛ መተግበሪያዎች ጥቅም አይደለም።"</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"የመተግበሪያ ክወናዎች ስታቲስቲክስን ሰርስረህ አውጣ"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"መተግበሪያው የተሰበሰቡ የክወና ስታስቲክሶችን ሰርስሮ እንዲያወጣ ይፈቅድለታል። ለመደበኛ መተግበሪያዎች ጥቅም ያልሆነ።"</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"የመተግበሪያ ክወናዎች ስታቲስቲክስን ይቀይሩ"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"መተግበሪያው የተሰበሰቡ የክወና ስታስቲክሶችን እንዲቀይር ይፈቅድሎታል። ለመደበኛ መተግበሪያዎች ጥቅም ያልሆነ።"</string>
     <string name="permlab_backup" msgid="470013022865453920">"የስርዓት መጠባበቂያን ተቆጣጠር እናእነበረበት መልስ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index d919829..c2f5a35 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -299,6 +299,8 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"لوضع مدير الأنشطة في حالة إيقاف التشغيل. لا يتم تنفيذ إيقاف تشغيل كامل."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"منع التبديل بين التطبيقات"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"لمنع المستخدم من التبديل إلى تطبيق آخر."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"الحصول على معلومات عن التطبيق الحالي"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"للسماح للمالك باسترداد معلومات خاصة عن التطبيق الحالي في مقدمة الشاشة."</string>
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"مراقبة بدء تشغيل جميع التطبيقات والتحكم فيها"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"للسماح للتطبيق بمراقبة كيفية بدء النظام للأنشطة والتحكم فيها. قد تُعرِّض التطبيقات الضارة النظام للضرر بشكل كامل. لن تكون هناك حاجة لهذا الإذن سوى للتطوير فقط، وليس للاستخدام العادي على الإطلاق."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"إرسال بث الحزمة الذي تمت إزالته"</string>
@@ -315,6 +317,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"للسماح لتطبيق بقراءة البيانات الحالية التي تستهلك مستوى منخفضًا من البطارية. قد يتيح التطبيق معرفة معلومات تفصيلية عن التطبيقات التي تستخدمها."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"تعديل إحصاءات البطارية"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"للسماح للتطبيق بتعديل إحصاءات البطارية المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"استرداد إحصاءات عمليات التطبيق"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"للسماح للتطبيق باسترداد إحصاءات عمليات التطبيق المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"تعديل إحصاءات تشغيل التطبيق"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"للسماح للتطبيق بتعديل إحصاءات تشغيل التطبيق المجمّعة. ليس للاستخدام بواسطة التطبيقات العادية."</string>
     <string name="permlab_backup" msgid="470013022865453920">"التحكم في النسخة الاحتياطية للنظام واستعادتها"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 0b37f93..0f1fda4 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Спыняе дзейнасць менеджэра. Не выконвае поўнае адключэнне."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"прадухіляць пераключэнне прыкладанняў"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Не дазваляе карыстальніку пераходзіць да іншага прыкладання."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"адсочваць і кантраляваць запуск усіх прыкладанняў"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Дазваляе прыкладанню сачыць і кантраляваць, як сістэма запускае працэсы. Шкоднасныя прыкладанні могуць цалкам парушыць працу сістэмы. Гэты дазвол патрэбны толькі для распрацоўкі, ніколі для звычайнага выкарыстання."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"трансляваць паведамленні аб выдаленні пакетаў"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Прыкладанне можа счытваць бягучыя звесткi пры нiзкi зарад акумулятара. Прыкладанне можа знайсцi падрабязную iнфармацы. пра прыкладаннi, якiя вы выкарыстоўваеце."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"змяняць статыстыку батарэі"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Дазваляе прыкладанням змяняць сабраную статыстыку батарэi. Не патрабуецца для звычайных прыкладанняў."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"атрымлiваць статыстыку выкарыстання прыкладання"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Дазваляе прыкладанню атрымлiваць сабраную статыстыку выкарыстання прыкладання. Не для выкарыстання звычайнымі прыкладаннямі."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"змяняць статыстыку выкарыстання прыкладання"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Дазваляе прыкладанню змяняць сабраную статыстыку выкарыстання прыкладання. Не для выкарыстання звычайнымі прыкладаннямі."</string>
     <string name="permlab_backup" msgid="470013022865453920">"кантраляваць рэзервовае капіяванне і аднаўленне сістэмы"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 9bb46c1..54b6198 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Изключва диспечера на дейностите. Не извършва пълно изключване."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"предотвратяване на превключването между приложения"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Не позволява на потребителя да превключва към друго приложение."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"наблюдение и контрол на стартирането на всички приложения"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Разрешава на приложението да наблюдава и контролира как системата стартира дейности. Злонамерените приложения могат изцяло да компрометират системата. Това разрешение е нужно само за програмиране, никога за нормална употреба."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"изпращане на излъчване при премахнат пакет"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Разрешава на приложението да чете текущите данни за работа при ниско ниво на батерията. Може да му разреши да намери подробна информация за ползваните от вас приложения."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"промяна на статистическите данни за батерията"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Разрешава на приложението да променя събраните статистически данни за батерията. Не е предназначено за нормални приложения."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"извличане на статистическите данни за операциите на приложението"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Разрешава на приложението да извлича събраните статистически данни за операциите си. Не е предназначено за нормални приложения."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"промяна на статистическите данни за операциите на приложението"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Разрешава на приложението да променя събраните статистически данни за операциите си. Не е предназначено за нормални приложения."</string>
     <string name="permlab_backup" msgid="470013022865453920">"контролиране на създаването и възстановяването на резервни копия на системата"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index eeda2cc..5acb723 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Posa el gestor d\'activitats en estat d\'apagada. No fa una apagada completa."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"impedir els canvis d\'aplicació"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impedeix que l\'usuari canviï a una altra aplicació."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"supervisa i controla tots els inicis d\'aplicacions"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permet que l\'aplicació supervisi i controli com el sistema inicia activitats. Les aplicacions malicioses poden comprometre totalment el sistema. Aquest permís només és necessari per al desenvolupament, mai per a l\'ús normal."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar difusió d\'eliminació de paquet"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permet que l\'aplicació llegeixi l\'ús de dades actual quan hi ha poca bateria. Pot permetre que l\'aplicació recopili informació detallada sobre les aplicacions que fas servir."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifica les estadístiques de la bateria"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permet que l\'aplicació modifiqui les estadístiques d\'ús de la bateria recopilades. No ho poden fer servir les aplicacions normals."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperació d\'estadístiques d\'ús de l\'aplicació"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permet que l\'aplicació recuperi les estadístiques d\'ús de l\'aplicació recopilades. No indicat per a les aplicacions normals."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifica les estadístiques d\'ús de l\'aplicació"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permet que l\'aplicació modifiqui les estadístiques d\'ús de l\'aplicació recopilades. No indicat per a les aplicacions normals."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar la còpia de seguretat i restauració del sistema"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f39e602..f10a217 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Uvede správce činností do vypnutého stavu. Nedojde však k úplnému vypnutí."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zabránění přepínání aplikací"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Zabrání uživateli přepnout na jinou aplikaci."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"sledování a řízení spouštění všech aplikací"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou systém zcela ovládnout. Toto oprávnění je požadováno pouze pro účely vývoje, nikdy pro běžné použití."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"odeslání vysílání o odstranění balíčku"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Umožňuje aplikaci číst aktuální podrobné údaje o využití baterie. Aplikace to může využít k získání podrobných informací o tom, které aplikace používáte."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"změna statistických údajů o baterii"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Umožňuje aplikaci upravit shromážděné statistiky o baterii. Toto oprávnění není určeno pro běžné aplikace."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"načtení statistik operací aplikace"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Umožňuje aplikaci načíst shromážděné statistiky operací aplikace. Toto oprávnění není určeno pro běžné aplikace."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"upravit statistiky operací aplikace"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Umožňuje aplikaci upravit shromážděné statistiky operací aplikace. Toto oprávnění není určeno pro běžné aplikace."</string>
     <string name="permlab_backup" msgid="470013022865453920">"ovládání zálohování a obnovy systému"</string>
@@ -408,19 +414,19 @@
     <string name="permlab_writeContacts" msgid="5107492086416793544">"úprava kontaktů"</string>
     <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Umožňuje aplikaci upravit údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
     <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Umožňuje aplikaci upravit údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string>
-    <string name="permlab_readCallLog" msgid="3478133184624102739">"číst seznam hovorů"</string>
+    <string name="permlab_readCallLog" msgid="3478133184624102739">"čtení seznamu hovorů"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Umožňuje aplikaci číst seznam hovorů v tabletu, včetně dat o příchozích a odchozích hovorech. Toto oprávnění umožňuje aplikaci ukládat údaje ze seznamu hovorů. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
     <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Umožňuje aplikaci číst seznam hovorů v telefonu, včetně dat o příchozích a odchozích hovorech. Toto oprávnění umožňuje aplikaci ukládat údaje ze seznamu hovorů. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string>
-    <string name="permlab_writeCallLog" msgid="8552045664743499354">"zapisovat seznam hovorů"</string>
+    <string name="permlab_writeCallLog" msgid="8552045664743499354">"zápis do seznamu hovorů"</string>
     <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Umožňuje aplikaci upravovat seznam hovorů vašeho tabletu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace to mohou zneužít k vymazání nebo změnám seznamu hovorů."</string>
     <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Umožňuje aplikaci upravovat seznam hovorů vašeho telefonu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace to mohou zneužít k vymazání nebo změnám seznamu hovorů."</string>
     <string name="permlab_readProfile" msgid="4701889852612716678">"čtení vaší vlastní vizitky"</string>
     <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Umožňuje aplikaci číst údaje v osobním profilu uložené v zařízení, například jméno nebo kontaktní údaje. Znamená to, že vás aplikace může identifikovat a odeslat údaje z profilu dalším aplikacím."</string>
     <string name="permlab_writeProfile" msgid="907793628777397643">"úprava vaší vlastní vizitky"</string>
     <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Umožňuje aplikaci změnit nebo přidat údaje osobního profilu uložené v zařízení, například jméno nebo kontaktní údaje. Znamená to, že vás aplikace může identifikovat a odeslat údaje z profilu dalším aplikacím."</string>
-    <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"číst váš sociální stream"</string>
+    <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"čtení vašeho sociálního streamu"</string>
     <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Umožňuje aplikaci získat přístup k sociálním aktualizacím od vašich přátel a synchronizaci těchto aktualizací. Při sdílení informací buďte opatrní – toto oprávnění umožňuje aplikaci číst komunikaci mezi vámi a vašimi přáteli v sociálních sítích bez ohledu na její důvěrnost. Poznámka: Toto oprávnění nemusí platit pro všechny sociální sítě."</string>
-    <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"zapisovat do vašeho sociálního streamu"</string>
+    <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"zápis do sociálního streamu"</string>
     <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Umožňuje aplikaci zobrazit sociální aktualizace od vašich přátel. Při sdílení informací buďte opatrní – aplikace s tímto oprávněním může vytvářet zprávy, které zdánlivě pochází od vašich přátel. Poznámka: Toto oprávnění nemusí platit pro všechny sociální sítě."</string>
     <string name="permlab_readCalendar" msgid="5972727560257612398">"čtení událostí kalendáře a důvěrné informace"</string>
     <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Umožňuje aplikaci číst všechny události kalendáře uložené v tabletu, včetně událostí přátel nebo spolupracovníků. Aplikace s tímto oprávněním může sdílet nebo ukládat údaje v kalendáři bez ohledu na důvěrnost nebo citlivost těchto údajů."</string>
@@ -503,8 +509,8 @@
     <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Umožňuje aplikaci ovládat telefonní funkce zařízení. Aplikace s tímto oprávněním smí bez upozornění přepínat sítě, zapínat a vypínat bezdrátový modul telefonu a podobně."</string>
     <string name="permlab_readPhoneState" msgid="9178228524507610486">"čtení stavu a identity telefonu"</string>
     <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Toto oprávnění umožňuje aplikaci zjistit telefonní číslo telefonu, identifikační čísla zařízení, zda zrovna probíhá hovor, a vzdálené číslo, ke kterému je hovor připojen."</string>
-    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"zabránění přechodu tabletu do režimu spánku"</string>
-    <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"zabránění přechodu telefonu do režimu spánku"</string>
+    <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"bránění přechodu tabletu do režimu spánku"</string>
+    <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"bránění přechodu telefonu do režimu spánku"</string>
     <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Umožňuje aplikaci zabránit přechodu tabletu do režimu spánku."</string>
     <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Umožňuje aplikaci zabránit přechodu telefonu do režimu spánku."</string>
     <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"zapnutí či vypnutí tabletu"</string>
@@ -528,12 +534,12 @@
     <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Umožňuje aplikaci změnit časové pásmo telefonu."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"role služby AccountManagerService"</string>
     <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Umožňuje aplikaci volat funkce AccountAuthenticator."</string>
-    <string name="permlab_getAccounts" msgid="1086795467760122114">"vyhledání účtů v zařízení"</string>
+    <string name="permlab_getAccounts" msgid="1086795467760122114">"vyhledávání účtů v zařízení"</string>
     <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Umožňuje aplikaci získat seznam účtů v tabletu. Mohou sem patřit i účty vytvořené aplikacemi, které jste nainstalovali."</string>
     <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Umožňuje aplikaci získat seznam účtů v telefonu. Mohou sem patřit i účty vytvořené aplikacemi, které jste nainstalovali."</string>
     <string name="permlab_authenticateAccounts" msgid="5265908481172736933">"vytváření účtů a nastavení hesel"</string>
     <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Umožňuje aplikaci používat funkce aplikace AccountManager související s ověřováním účtů – včetně vytváření účtů a získávání a nastavování hesel."</string>
-    <string name="permlab_manageAccounts" msgid="4983126304757177305">"přidání nebo odebrání účtů"</string>
+    <string name="permlab_manageAccounts" msgid="4983126304757177305">"přidávání nebo odebírání účtů"</string>
     <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Umožňuje aplikaci provádět operace, jako je přidávání nebo odebírání účtů nebo mazání jejich hesel."</string>
     <string name="permlab_useCredentials" msgid="235481396163877642">"používání účtů v zařízení"</string>
     <string name="permdesc_useCredentials" msgid="7984227147403346422">"Umožňuje aplikaci požadovat ověřovací tokeny."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 45f551c..eec3dd4 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Sætter aktivitetsadministratoren i lukningstilstand. Lukker ikke helt ned."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"undgå programskift"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Forhindrer brugeren i at skifte til en anden app."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"overvåge og kontrollere åbning af alle apps"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Tillader, at appen kan overvåge og kontrollere, hvordan systemet starter aktiviteter. Ondsindede apps kan fuldstændig kompromittere systemet. Denne tilladelse er kun nødvendig til udvikling, aldrig til normal brug."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"send udsendelse om fjernet pakke"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Tillader, at en applikation læser de aktuelle data for batteriforbruget. Kan tillade, at applikationen henter detaljerede oplysninger om, hvilke apps du bruger."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"rediger batteristatistikker"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tillader, at appen kan ændre indsamlede batteristatistikker. Anvendes ikke af normale apps."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"hent statistikker for handlinger i appen"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Tillader, at appen indhenter statistikker for handlinger i applikationen. Denne handling bruges ikke i almindelige apps."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"lav ændringer i statistik for handlinger i appen"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tillader, at appen kan ændre indsamlede statistikker for handlinger i applikationen. Dette kan ikke bruges af almindelige apps."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontroller sikkerhedskopiering af system, og gendan"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 1ef42f6..d5a67f0 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Versetzt den Aktivitätsmanager in einen heruntergefahrenen Zustand. Führt kein vollständiges Herunterfahren aus."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"App-Wechsel verhindern"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Hindert den Nutzer daran, zu einer anderen App zu wechseln"</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"Start von Apps überwachen und steuern"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ermöglicht der App, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Apps können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Nutzung benötigt."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"Broadcast ohne Paket senden"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Ermöglicht einer Anwendung, den momentan niedrigen Akkustand zu erkennen. Unter Umständen erhält die App detaillierte Informationen darüber, welche Apps Sie verwenden."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"Akkudaten ändern"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ermöglicht der App, erfasste Akkudaten zu ändern. Nicht für normale Apps vorgesehen."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"App-Vorgangsstatistiken abrufen"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ermöglicht der App, erfasste App-Vorgangsstatistiken abzurufen. Kann nicht von normalen Apps verwendet werden."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"App-Vorgangsstatistiken ändern"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ermöglicht der App, erfasste App-Vorgangsstatistiken zu ändern. Kann nicht von normalen Apps verwendet werden"</string>
     <string name="permlab_backup" msgid="470013022865453920">"Systemsicherung und -wiederherstellung kontrollieren"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f3333dd..cf42a41 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Θέτει το πρόγραμμα διαχείρισης δραστηριοτήτων σε κατάσταση τερματισμού λειτουργιών. Δεν εκτελεί πλήρη τερματισμό λειτουργιών."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"αποτροπή εναλλαγών εφαρμογών"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Δεν επιτρέπει στο χρήστη να μεταβεί σε άλλη εφαρμογή."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"παρακολούθηση και έλεγχος όλων των εκκινήσεων εφαρμογών"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Επιτρέπει στην εφαρμογή να παρακολουθεί και να ελέγχει τον τρόπο με τον οποίο το σύστημα εκκινεί δραστηριότητες. Τυχόν κακόβουλες εφαρμογές ενδέχεται να θέσουν σε κίνδυνο το σύστημα. Αυτή η άδεια είναι απαραίτητη μόνο για σκοπούς ανάπτυξης και ποτέ για συνήθη χρήση."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"αποστολή εκπομπής χωρίς πακέτο"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Επιτρέπει σε μια εφαρμογή να διαβάζει τα δεδομένα τρέχουσας χαμηλού επιπέδου χρήσης μπαταρίας. Ενδέχεται να επιτρέπει στην εφαρμογή να εντοπίσει λεπτομερείς πληροφορίες σχετικά με τις εφαρμογές που χρησιμοποιείτε."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"τροποποίηση στατιστικών στοιχείων μπαταρίας"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Επιτρέπει στην εφαρμογή την τροποποίηση στατιστικών στοιχείων μπαταρίας που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"ανάκτηση στατιστικών στοιχείων λειτουργίας για εφαρμογές"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Επιτρέπει στην εφαρμογή την ανάκτηση των στατιστικών στοιχείων λειτουργίας για τις εφαρμογές που έχουν συλλεχθεί. Δεν προορίζεται για χρήση από κανονικές εφαρμογές."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"τροποποίηση στατιστικών στοιχείων λειτουργιών εφαρμογών"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Επιτρέπει στην εφαρμογή την τροποποίηση των στατιστικών στοιχείων λειτουργίας εφαρμογών που έχουν συλλεχθεί. Δεν προορίζεται για χρήση από κανονικές εφαρμογές."</string>
     <string name="permlab_backup" msgid="470013022865453920">"αντίγραφο ασφαλείας και επαναφορά συστήματος"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 538dd66..73ee358 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Puts the activity manager into a shut-down state. Does not perform a complete shut down."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"prevent app switches"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Prevents the user from switching to another app."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitor and control all app launching"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Allows the app to monitor and control how the system launches activities. Malicious apps may completely compromise the system. This permission is only needed for development, never for normal use."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"send package removed broadcast"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Allows an application to read the current low-level battery use data. May allow the application to find out detailed information about which apps you use."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modify battery statistics"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Allows the app to modify collected battery statistics. Not for use by normal apps."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"retrieve app ops statistics"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Allows the app to retrieve collected application operation statistics. Not for use by normal apps."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modify app ops statistics"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Allows the app to modify collected component usage statistics. Not for use by normal apps."</string>
     <string name="permlab_backup" msgid="470013022865453920">"control system back up and restore"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 8fc1450..6bb8e44 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Pone al administrador de la actividad en estado de cierre. No realiza un cierre completo."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"impedir conmutadores de aplicación"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Evita que el usuario cambie a otra aplicación."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"supervisar y controlar la ejecución de todas las aplicaciones"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite que la aplicación supervise y controle la manera en la que el sistema inicia actividades. Las aplicaciones maliciosas pueden comprometer el sistema por completo. Este permiso es necesario solo para el desarrollo, nunca para el uso habitual."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar emisión de paquete eliminado"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite a una aplicación leer los datos actuales de uso de batería de bajo nivel. Puede permitir a la aplicación buscar información detallada sobre las aplicaciones que usas."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar las estadísticas de la batería"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite a la aplicación modificar las estadísticas recopiladas de la batería. Las aplicaciones normales no deben utilizarlo."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"Recuperar estadísticas de operaciones de la aplicación"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que la aplicación recupere las estadísticas recopiladas de operación de la aplicación. Las aplicaciones normales no deben utilizar este permiso."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estadísticas de uso de aplicaciones"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que la aplicación modifique las estadísticas recopiladas sobre el uso de aplicaciones. Las aplicaciones normales no deben utilizar este permiso."</string>
     <string name="permlab_backup" msgid="470013022865453920">"copia de seguridad y restauración del sistema de control"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 17a7e86..fbbcf89 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Pone el administrador de actividades en estado de cierre. No realiza un cierre completo."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"evitar cambios de aplicación"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Evita que el usuario cambie a otra aplicación."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"supervisar y controlar la ejecución de todas las aplicaciones"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite que la aplicación supervise y controle la ejecución de las actividades del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso es necesario únicamente para tareas de desarrollo, nunca para el uso habitual."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar emisión eliminada de paquete"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que una aplicación consulte los datos actuales de uso de batería de nivel inferior. Puede permitir que la aplicación obtenga información detallada sobre las aplicaciones que utilizas."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estadísticas de la batería"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que la aplicación modifique las estadísticas recopiladas sobre la batería. Las aplicaciones normales no deben usar este permiso."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperar estadísticas de operaciones de aplicaciones"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que la aplicación recupere las estadísticas recopiladas sobre operaciones de aplicaciones. Las aplicaciones normales no deben usar este permiso."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estadísticas de operaciones de aplicaciones"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que la aplicación modifique las estadísticas recopiladas sobre operaciones de aplicaciones. Las aplicaciones normales no deben usar este permiso."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar las copias de seguridad y las restauraciones del sistema"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 8b4408a..00b5c2d 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Lülitab tegevushalduri väljalülitusolekusse. Ei lülita lõplikult välja."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"väldi rakenduste ümberlülitamist"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Takistab kasutaja lülitumist teisele rakendusele."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"Kõigi rakenduste käivitumise jälgimine ja juhtimine"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Võimaldab rakendusel jälgida ja juhtida, kuidas süsteem tegevusi käivitab. Pahatahtlikud rakendused võivad süsteemi täielikult rikkuda. Seda õigust on vaja ainult arenduseks, mitte tavakasutuse korral."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"saada paketist eemaldatud saade"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Lubab rakendusel lugeda madala akutaseme kasutusandmeid. Võib lubada rakendusel hankida üksikasjalikku teavet selle kohta, mis rakendusi te kasutate."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"aku statistika muutmine"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Võimaldab rakendusel muuta aku kohta kogutud statistikat. Mitte kasutada tavarakenduste puhul."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"rakenduse tööstatistika hankimine"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Võimaldab rakendusel hankida kogutud rakenduse tööstatistikat. Mitte kasutada tavarakenduste puhul."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"rakenduse tööstatistika muutmine"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Võimaldab rakendusel muuta kogutud rakenduse tööstatistikat. Mitte kasutada tavarakenduste puhul."</string>
     <string name="permlab_backup" msgid="470013022865453920">"juhi süsteemi varundust ja taastet"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 3f2da2c..3cbd496 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -299,6 +299,8 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"مدیر فعالیت را در حالت خاموشی قرار می‌دهد. خاموشی را به صورت کامل انجام نمی‌دهد."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ممانعت از جابجایی برنامه"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"اجازه نمی‎دهد کاربر به برنامه دیگری برود."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"دریافت اطلاعات برنامه فعلی"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"به دارنده اجازه می‌دهد اطلاعات خصوصی مربوط به برنامه فعلی را در پیش زمینه صفحه بازیابی کند."</string>
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"نظارت و کنترل راه‌اندازی همه برنامه"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"به برنامه اجازه می‎دهد تا نحوه راه‌اندازی فعالیت‌های سیستم را کنترل کند. برنامه‎های مخرب می‎توانند کاملا با سیستم سازگار شوند. این مجوز فقط برای توسعه نیاز است و برای استفاده عادی نیست."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ارسال پخش بسته حذف شده"</string>
@@ -315,6 +317,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"به یک برنامه کاربردی اجازه می‌دهد که داده‌های استفاده کننده از میزان باتری کم کنونی را بخواند. این کار ممکن است به برنامه این امکان را بدهد که اطلاعات جزئی درباره برنامه‌هایی که استفاده می‌کنید، بدست آورد."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"اصلاح آمار باتری"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"به برنامه اجازه می‎دهد تا آمار جمع‌آوری شده باتری را تغییر دهد. برای استفاده برنامه‎های عادی نیست."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"بازیابی آمار مربوط به کارکرد برنامه"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"به برنامه امکان می‌دهد آمار جمع‌آوری شده مربوط به عملکرد برنامه را بازیابی کند. برای استفاده توسط برنامه‌های معمولی، در نظر گرفته نشده است."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"تغییر آمار کارکرد برنامه"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"به برنامه اجازه تغییر آمار کارکرد جمع‌آوری شده از برنامه را می‌دهد. برای استفاده توسط برنامه‌های معمولی نیست."</string>
     <string name="permlab_backup" msgid="470013022865453920">"کنترل نسخهٔ پشتیبان سیستم و بازیابی"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7573f41..c4dfd6c 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Asettaa toimintojen hallinnan sulkeutumistilaan. Ei sulje puhelinta kokonaan."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"estä sovellusten vaihto"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Estää käyttäjää siirtymästä toiseen sovellukseen."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"kaikkien sovellusten käynnistämisen valvonta ja hallinta"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Antaa sovelluksen valvoa ja hallita sitä, miten laite käynnistää toimintoja. Haitalliset sovellukset voivat vaarantaa laitteen käytön. Tätä oikeutta tarvitaan vain kehityskäyttöön eikä koskaan tavalliseen käyttöön."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"lähetä paketeista poistettuja lähetyksiä"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Antaa sovelluksen lukea nykyisiä alhaisen tason akunkäyttötietoja. Sovellus saattaa saada tietoonsa, mitä sovelluksia käytät."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"muokkaa akkutilastoja"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Antaa sovelluksen muokata kerättyjä akkutilastoja. Ei tavallisten sovellusten käyttöön."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"nouda sovellusten toimintatilastoja"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Antaa sovelluksen noutaa kerättyjä sovellusten toimintatilastoja. Ei tavallisten sovellusten käyttöön."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"sovellusten käyttötilastojen muokkaus"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Antaa sovelluksen muokata kerättyjä sovellusten käyttötilastoja. Ei tavallisten sovellusten käyttöön."</string>
     <string name="permlab_backup" msgid="470013022865453920">"hallitse järjestelmän varmuuskopiointia ja palauttamista"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index e4aad26..ea1ef50 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Place le gestionnaire d\'activités en état d\'arrêt. N\'effectue pas un arrêt complet."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"empêcher les changements d\'applications"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Empêche l\'utilisateur de changer d\'application."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"suivre et contrôler le lancement de toutes les applications"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permet à l\'application de surveiller et de contrôler la façon dont le système lance les activités. Des applications malveillantes peuvent exploiter cette fonctionnalité pour totalement compromettre le système. Cette autorisation est uniquement destinée aux développeurs. Elle ne doit jamais être activée dans le cadre d\'une utilisation standard."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"Envoyer une diffusion sans paquet"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permet à une application de lire les données de consommation actuelles indiquant le faible niveau de la batterie. Permet éventuellement à l\'application d\'obtenir des informations détaillées sur les applications que vous utilisez."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifier les statistiques de la batterie"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permet à l\'application de modifier les statistiques collectées concernant la batterie. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"récupérer les statistiques de fonctionnement des applications"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permet à l\'application de récupérer les statistiques de fonctionnement des applications recueillies. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifier les statistiques de fonctionnement des applications"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permet à l\'application de modifier les statistiques de fonctionnement des applications collectées. Les applications standards ne doivent pas utiliser cette fonctionnalité."</string>
     <string name="permlab_backup" msgid="470013022865453920">"contrôler la sauvegarde et la restauration du système"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index f4e2d3e..c3ef672 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"गतिविधि प्रबंधक को शटडाउन स्‍थिति में रखता है. पूर्ण शटडाउन निष्‍पादित नहीं करता है."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"एप्‍लिकेशन स्‍विच करने से रोकता है"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"उपयोगकर्ता को दूसरे एप्‍लिकेशन पर स्‍विच करने से रोकता है."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"सभी एप्‍लिकेशन की लॉन्‍चिंग की निगरानी करें और उसे नियंत्रित करें"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"एप्लिकेशन को यह निगरानी और नियंत्रित करने देता है कि सिस्टम कैसे गतिविधियां लॉन्च करता है. दुर्भावनापूर्ण एप्लिकेशन सिस्टम को पूरी तरह से जोखिम में डाल सकते हैं. इस अनुमति की आवश्यकता केवल विकास के लिए है, सामान्य उपयोग के लिए कभी नहीं."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"पैकेज निकाले गए प्रसारण भेजें"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"एप्लिकेशन को वर्तमान निम्न-स्तरीय बैटरी उपयोग डेटा पढ़ने देती है. एप्लिकेशन को आपके द्वारा उपयोग किए जाने वाले एप्लिकेशन के बारे में विस्तृत जानकारी ढूंढने दे सकती है."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"बैटरी के आंकड़े संशोधित करें"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"एप्‍लिकेशन को बैटरी के संकलित आंकड़ों को संशोधित करने देती है. सामान्‍य एप्‍लिकेशन के द्वारा उपयोग करने के लिए नहीं."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"एप्लिकेशन संचालन आंकड़े प्राप्त करें"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"एप्लिकेशन को संकलित एप्लिकेशन संचालन आंकड़े प्राप्त करने देता है. सामान्य एप्लिकेशन के द्वारा उपयोग के लिए नहीं."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"एप्लिकेशन कार्यवाही के आंकड़े बदलें"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"एप्लिकेशन को एप्लिकेशन कार्यवाही के एकत्रित आंकड़े बदलने देता है. सामान्य एप्लिकेशन के द्वारा उपयोग करने के लिए नहीं."</string>
     <string name="permlab_backup" msgid="470013022865453920">"सिस्‍टम बैकअप नियंत्रित और पुनर्स्‍थापित करें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index a7085f4..72aad27 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Postavlja upravitelja za aktivnost u stanje mirovanja. Ne isključuje ga u potpunosti."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"sprečavanje promjene aplikacije"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Sprječava korisnika u prebacivanju na drugu aplikaciju."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"praćenje i nadzor svih pokretanja aplikacija"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Omogućuje aplikaciji nadzor i upravljanje načinom na koji sustav pokreće aktivnosti. Zlonamjerne aplikacije mogu posve ugroziti sustav. Ta je dozvola potrebna samo za razvoj, nikada za uobičajenu upotrebu."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"slanje paketno uklonjenog prijenosa"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Aplikacija može očitavati podatke o trenutačnoj potrošnji baterije na niskoj razini. Tako može doznati detaljne informacije o aplikacijama koje upotrebljavate."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"izmjena statistike o bateriji"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Omogućuje aplikaciji promjenu prikupljene statistike o potrošnji baterije. Nije namijenjena uobičajenim aplikacijama."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"dohvaćanje statistike o radu aplikacije"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Aplikaciji omogućuje dohvaćanje prikupljene statistike o radu aplikacije. Nije namijenjena uobičajenim aplikacijama."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"izmjena statistike o radu aplikacije"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Aplikaciji omogućuje promjenu prikupljene statistike o radu aplikacije. Nije namijenjena uobičajenim aplikacijama."</string>
     <string name="permlab_backup" msgid="470013022865453920">"sigurnosna kopija i oporavak nadzornog sustava"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 840ed06..6dd4f8f 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Leállítás állapotba helyezi a tevékenységkezelőt. Nem hajtja végre a teljes leállítást."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"alkalmazásváltás megakadályozása"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Megakadályozza, hogy a felhasználó átváltson egy másik alkalmazásra."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"alkalmazásindítások nyomon követése és vezérlése"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Lehetővé teszi az alkalmazás számára, hogy figyelje és vezérelje, hogy a rendszer hogyan indít el tevékenységeket. A rosszindulatú alkalmazások teljesen tönkretehetik a rendszert. Ez az engedély csak fejlesztéshez szükséges, normál használathoz sosem."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"eltávolított csomagú üzenetek küldése"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Lehetővé teszi egy alkalmazás számára, hogy leolvassa az aktuális alacsony szintű akkumulátorhasználatra vonatkozó adatokat. Ezáltal az alkalmazás részletes adatokhoz jut az Ön által használt alkalmazásokról."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"akkumulátorstatisztikák módosítása"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Lehetővé teszi az alkalmazás számára az összegyűjtött akkumulátorhasználati statisztikák módosítását. Normál alkalmazások nem használhatják."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"alkalmazásműveleti statisztikák lekérdezése"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Lehetővé teszi az alkalmazás számára az összegyűjtött alkalmazásműveleti statisztikák lekérdezését. Normál alkalmazások nem használhatják."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"alkalmazásműveleti statisztikák módosítása"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Lehetővé teszi az alkalmazás számára az összegyűjtött alkalmazásműveleti statisztikák módosítását. Normál alkalmazások nem használhatják."</string>
     <string name="permlab_backup" msgid="470013022865453920">"rendszer biztonsági mentésének és helyreállításának vezérlése"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 638528f..8d3c139 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Letakkan pengelola aktivitas dalam kondisi mati. Tidak melakukan penonaktifan penuh."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"cegah pergantian aplikasi"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Mencegah pengguna beralih ke apl lain."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"memantau dan mengontrol semua peluncuran apl"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Mengizinkan apl memantau dan mengontrol cara sistem meluncurkan kegiatan. Apl berbahaya dapat meretas sistem sepenuhnya. Izin ini hanya diperlukan untuk pengembangan, tidak pernah diperlukan untuk penggunaan normal."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"kirim siaran paket dihapus"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Mengizinkan aplikasi membaca data penggunaan baterai tingkat rendah. Dapat mengizinkan aplikasi mencari informasi mendetail tentang aplikasi mana yang Anda gunakan."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ubah statistik baterai"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Mengizinkan aplikasi mengubah statistik baterai yang dikumpulkan. Tidak untuk digunakan oleh aplikasi normal."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"mengambil statistik pengoperasian aplikasi"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Mengizinkan aplikasi mengambil statistik pengoperasian aplikasi yang dikumpulkan. Tidak untuk digunakan oleh aplikasi normal."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"memodifikasi statistik pengoperasian aplikasi"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Mengizinkan aplikasi memodifikasi statistik pengoperasian aplikasi yang dikumpulkan. Tidak untuk digunakan oleh aplikasi normal."</string>
     <string name="permlab_backup" msgid="470013022865453920">"mengontrol cadangan dan pemulihan sistem"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index d3eaa61..7fc8b73 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Mette il gestore delle attività in uno stato di chiusura. Non esegue una chiusura completa."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"impedire commutazione applicazione"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impedisce all\'utente di passare a un\'altra applicazione."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitoraggio e controllo avvio di tutte le applicazioni"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Consente all\'applicazione di monitorare e controllare l\'avvio delle attività da parte del sistema. Le applicazioni dannose potrebbero compromettere completamente il sistema. Questa autorizzazione è necessaria solo per lo sviluppo, mai per l\'utilizzo normale."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"invio broadcast rimossi dal pacchetto"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Consente a un\'applicazione di leggere i dati di utilizzo della batteria di basso livello correnti. Potrebbe consentire all\'applicazione di trovare informazioni dettagliate sulle applicazioni che utilizzi."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifica statistiche batteria"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Consente all\'applicazione di modificare le statistiche raccolte sulla batteria. Da non usare per normali applicazioni."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recupero statistiche funzion. app"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Consente all\'applicazione di recuperare le statistiche raccolte sul funzionamento dell\'applicazione. Da non usare per normali applicazioni."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modifica statistiche funzionamento app"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Consente all\'applicazione di modificare le statistiche raccolte sul funzionamento dell\'applicazione. Da non usare per normali applicazioni."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controllo del backup di sistema e ripristino"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 784a893..fff9c52 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -299,6 +299,8 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"מעביר את מנהל הפעילויות למצב כיבוי. לא מבצע כיבוי מלא."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"מנע החלפת יישומים"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"מניעת מעבר ליישום אחר על ידי המשתמש."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"קבל פרטים על היישום הנוכחי"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"מאפשר לבעלים לאחזר מידע פרטי לגבי היישום הנוכחי שבקדמת המסך."</string>
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"ניהול מעקב ושליטה על כל הפעלות היישומים"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"מאפשר ליישום לנהל מעקב אחר האופן שבו המערכת מפעילה פעילויות, ולשלוט בו. יישומים זדוניים עלולים לסכן את המערכת כולה. הרשאה זו אינה נחוצה לשימוש רגיל, אלא לפיתוח בלבד."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"שלח שידור שהוסר מחבילה"</string>
@@ -315,6 +317,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"מאפשר ליישום לקרוא את נתוני השימוש הנוכחיים של הסוללה ברמה נמוכה. עשוי לאפשר ליישום לגלות מידע מפורט לגבי היישומים שבהם אתה משתמש."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"שינוי הנתונים הסטטיסטיים של הסוללה"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"מאפשר ליישום לשנות נתונים סטטיסטיים שנאספו לגבי הסוללה. לא מיועד לשימוש על ידי יישומים רגילים."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"אחזור נתונים סטטיסטיים של פעולות יישום"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"הרשאה זו מאפשרת ליישום לאחזר נתונים סטטיסטיים שנאספו לגבי פעולות יישום. לא מיועד לשימוש על ידי יישומים רגילים."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"שינוי סטטיסטיקת ההפעלה של היישום"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"מאפשר ליישום לשנות נתונים סטטיסטיים שנאספו לגבי הפעלתו. לא מיועד לשימוש על ידי יישומים רגילים."</string>
     <string name="permlab_backup" msgid="470013022865453920">"שלוט בגיבוי ובשחזור של המערכת"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index e53ff29..0afcbf7 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"アクティビティマネージャをシャットダウン状態にします。完全なシャットダウンは実行しません。"</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"アプリケーションの切り替えを禁止する"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"ユーザーが別のアプリに切り替えられないようにします。"</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"すべてのアプリ起動の監視と制御"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"システムによるアクティビティ起動方法を監視し制御することをアプリに許可します。この許可を悪意のあるアプリに利用されると、システム全体のセキュリティが侵害される恐れがあります。この許可は開発時にのみ必要で、通常の使用では不要です。"</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"パッケージ削除ブロードキャストの送信"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"現在の電池消費量の低レベルデータを読み取ることをアプリに許可します。このアプリが、使用しているアプリの詳細情報を確認できるようになります。"</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"電池統計情報の変更"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"電池に関して収集した統計情報の変更をアプリに許可します。通常のアプリでは使用しません。"</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"アプリの操作状況に関する統計情報の取得"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"アプリの操作状況に関して収集された統計情報の取得をアプリに許可します。通常のアプリでは使用しません。"</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"アプリの操作状況に関する統計情報の変更"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"アプリの操作状況に関して収集された統計情報の変更をアプリに許可します。通常のアプリでは使用しません。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"システムのバックアップと復元を制御する"</string>
@@ -785,11 +791,11 @@
     <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ユーザーガイドをご覧いただくか、お客様サポートにお問い合わせください。"</string>
     <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIMカードはロックされています。"</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIMカードのロック解除中..."</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"正しくないパスワードを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"正しくないPINを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"正しくないパスワードを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"正しくないPINを<xliff:g id="NUMBER_0">%d</xliff:g>回入力しました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にGoogleへのログインが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"タブレットのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、タブレットは工場出荷状態にリセットされ、ユーザーのデータはすべて失われます。"</string>
     <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"端末のロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、端末は工場出荷状態にリセットされ、ユーザーのデータはすべて失われます。"</string>
     <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"タブレットのロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。タブレットを工場出荷状態にリセットします。"</string>
@@ -1420,7 +1426,7 @@
     <string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string>
     <string name="kg_wrong_password" msgid="2333281762128113157">"パスワードが正しくありません"</string>
     <string name="kg_wrong_pin" msgid="1131306510833563801">"PINが正しくありません"</string>
-    <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+    <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g>秒後にもう一度お試しください。"</string>
     <string name="kg_pattern_instructions" msgid="398978611683075868">"パターンを入力"</string>
     <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PINを入力"</string>
     <string name="kg_pin_instructions" msgid="2377242233495111557">"PINを入力"</string>
@@ -1442,15 +1448,15 @@
     <string name="kg_login_invalid_input" msgid="5754664119319872197">"ユーザー名またはパスワードが無効です。"</string>
     <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ユーザー名またはパスワードを忘れた場合は"\n" "<b>"google.com/accounts/recovery"</b>" にアクセスしてください。"</string>
     <string name="kg_login_checking_password" msgid="1052685197710252395">"アカウントをチェックしています…"</string>
-    <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PINの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"パスワードの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+    <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PINの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"パスワードの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。"\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
     <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"タブレットのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、タブレットは出荷時設定にリセットされ、ユーザーのデータはすべて失われます。"</string>
     <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"携帯端末のロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、端末は出荷時設定にリセットされ、ユーザーのデータはすべて失われます。"</string>
     <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"タブレットのロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。タブレットは出荷時設定にリセットされます。"</string>
     <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"携帯端末のロック解除を<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。端末は出荷時設定にリセットされます。"</string>
-    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
-    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒以内にもう一度お試しください。"</string>
+    <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
+    <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。"\n\n"<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
     <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
     <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"削除"</string>
     <string name="safe_media_volume_warning" product="default" msgid="7382971871993371648">"安全レベルを超えるまで音量を上げますか？"\n"大音量で長時間聞き続けると、聴力を損なう恐れがあります。"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 17006fd..85b35a7 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"작업 관리자를 종료 상태로 설정합니다. 전체 종료를 수행하지는 않습니다."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"애플리케이션 전환 방지"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"사용자가 다른 앱으로 전환하지 못하게 합니다."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"실행 중인 모든 앱 모니터링 및 제어"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"앱이 시스템에서 활동이 시작되는 방식을 모니터링하고 관리할 수 있도록 허용합니다. 이 경우 악성 앱이 이 기능을 이용하여 시스템을 완전히 손상시킬 수 있습니다. 이 권한은 개발 과정에만 필요하며 일반 사용 시에는 필요하지 않습니다."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"패키지 제거 브로드캐스트 보내기"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"애플리케이션이 현재의 낮은 수준 배터리 사용 데이터를 읽을 수 있도록 합니다. 이 경우 애플리케이션이 내가 사용하는 앱에 대한 세부정보를 파악할 수도 있습니다."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"배터리 통계 수정"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"앱이 수집된 배터리 통계를 수정할 수 있도록 허용합니다. 일반 앱에서는 사용하지 않습니다."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"앱 운영 통계 검색"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"앱이 수집된 애플리케이션 운영 통계를 검색하도록 합니다. 일반 앱에서는 사용하지 않습니다."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"앱 운영 통계 수정"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"앱이 수집된 애플리케이션 운영 통계를 수정하도록 합니다. 일반 앱에서는 사용하지 않습니다."</string>
     <string name="permlab_backup" msgid="470013022865453920">"시스템 백업 및 복원 관리"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 7700f1c..86262e9 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Veiklos tvarkyklę perjungia į išsijungimo būseną. Neišjungia visiškai."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"neleisti perjungti programų"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Neleidžiama naudotojui perjungti į kitą programą."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"stebėti ir valdyti visų programų paleidimą"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Leidžiama programai stebėti ir valdyti, kaip sistema paleidžia veiklą. Kenkėjiškos programos gali visiškai pažeisti sistemą. Šis leidimas reikalingas tik kuriant ir jo niekada nereikia naudojant įprastai."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"siųsti pašalinto paketo perdavimą"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Leidžiama programai skaityti dabartinius išsikraunančio akumuliatoriaus naudojimo duomenis. Gali būti leidžiama programai sužinoti išsamią informaciją apie jūsų naudojamas programas."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"keisti akumuliatoriaus statistiką"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Leidžiama programai keisti surinktą akumuliatoriaus statistiką. Neskirta naudoti įprastoms programoms."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"nuskaityti programos naudojimo statistiką"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Programai leidžiama nuskaityti surinktą programos naudojimo statistiką. Neskirta naudoti įprastoms programoms."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"keisti programos naudojimo statistiką"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Programai leidžiama keisti surinktą programos naudojimo statistiką. Neskirta naudoti įprastoms programoms."</string>
     <string name="permlab_backup" msgid="470013022865453920">"valdyti sistemos atsarginę kopiją ir atkūrimą"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 040beb1..cd28e58 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Liek darbību pārvaldniekam pāriet izslēgšanas stāvoklī. Neveic pilnīgu izslēgšanu."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"novērst lietojumprogrammu pārslēgšanu"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Novērš lietotāja pārslēgšanos uz citu lietotni."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"pārraudzīt un kontrolēt visu lietotņu atvēršanu"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ļauj lietotnei pārraudzīt un kontrolēt, kā sistēmā tiek palaistas darbības. Ļaunprātīgas lietotnes var pilnībā uzlauzt sistēmu. Šī atļauja ir nepieciešama tikai izstrādei, taču ne parastai lietošanai."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"sūtīt apraidi par pakotnes noņemšanu"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Ļauj lietojumprogrammai lasīt pašreizējos zema akumulatora enerģijas patēriņa datus. Var atļaut lietojumprogrammai iegūt detalizētu informāciju par to, kuras lietotnes izmantojat."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"akumulatora statistikas pārveidošana"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ļauj lietotnei pārveidot apkopoto statistiku par akumulatoru. Atļauja neattiecas uz parastām lietotnēm."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"Izgūt lietotnes darbību statistiku"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ļauj lietotnei izgūt apkopoto statistiku par lietojumprogrammas darbību. Atļauja neattiecas uz parastām lietotnēm."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"Pārveidot lietotnes darbības statistiku"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ļauj lietotnei pārveidot apkopoto statistiku par lietojumprogrammas darbību. Atļauja neattiecas uz parastām lietotnēm."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolēt sistēmas dublējumu un atjaunošanu"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 436a1db..0ab4384 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -299,6 +299,8 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Meletakkan pengurus aktiviti dalam keadaan tutup. Tidak melaksanakan penutupan lengkap."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"halang pertukaran apl"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Menghalang pengguna daripada bertukar kepada apl lain."</string>
+    <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"dapatkan maklumat apl. semasa"</string>
+    <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Membenarkan pemegang mendapatkan maklumat peribadi tentang permohonan semasa di latar hadapan skrin"</string>
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"pantau dan kawal semua pelancaran apl"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Membenarkan apl untuk memantau dan mengawal cara sistem melancarkan aktiviti. Apl hasad boleh menjejaskan sistem sepenuhnya. Kebenaran ini hanya diperlukan untuk pembangunan, tidak sekali-kali untuk penggunaan biasa."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"hantar siaran bahawa pakej telah dialih keluar"</string>
@@ -315,6 +317,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Membenarkan aplikasi membaca data penggunaan bateri tahap rendah semasa. Boleh membenarkan aplikasi untuk mencari maklumat terperinci tentang apl yang anda gunakan."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ubah suai statistik bateri"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Membenarkan apl mengubah suai statistik bateri yang dikumpul. Bukan untuk penggunaan apl normal."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"dapatkan semula statistik pengendalian apl"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Membenarkan apl mendapatkan semula statistik pengendalian aplikasi yang dikumpul. Bukan untuk kegunaan apl biasa."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"ubah suai apl ops statistik"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Membenarkan apl mengubah suai statistik operasi aplikasi yang dikumpul. Bukan untuk kegunaan apl biasa."</string>
     <string name="permlab_backup" msgid="470013022865453920">"sandaran dan pemulihan sistem kawalan"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 3a7cd46..0969c34 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Lar applikasjonen sette aktivitetshåndtereren i avslutningstilstand. Slår ikke systemet helt av."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"forhindre applikasjonsbytte"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Hindrer brukeren i å bytte til en annen app."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"avervåke og kontrollere all oppstart av apper"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Lar appen overvåke og kontrollere hvordan systemet starter opp aktiviteter. Ondsinnede apper kan utsette hele systemet for sikkerhetsbrudd. Denne tillatelsen er bare nødvendig for utviklere, aldri for vanlig bruk."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"kringkaste melding om fjernet pakke"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Lar apper lese gjeldende data på lavt nivå om batteribruk. Kan også la appen finne ut detaljert informasjon om hvilke apper du bruker."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"endre batteristatistikk"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Lar appen endre innsamlet batteristatistikk. Ikke beregnet på vanlige apper."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"hente bruksstatistikk for appen"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Lar appen hente innsamlet bruksstatistikk. Ikke beregnet på vanlige apper."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"endre bruksstatistikk for appen"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Lar appen endre innsamlet bruksstatistikk. Ikke beregnet på vanlige apper."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrollere sikkerhetskopiering og gjenoppretting"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1dd9fe9..f82e5dc 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Hiermee wordt activiteitenbeheer uitgeschakeld. Er wordt geen volledige uitschakeling uitgevoerd."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"schakelen tussen apps voorkomen"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Hiermee wordt voorkomen dat de gebruiker overschakelt naar een andere app."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"alle startende apps bijhouden en beheren"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Hiermee kan de app de manier bijhouden en beheren waarop het systeem activiteiten start. Schadelijke apps kunnen het systeem volledig in gevaar brengen. Deze machtiging is alleen voor ontwikkeling vereist, nooit voor normaal gebruik."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"melding verzenden dat pakket is verwijderd"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Hiermee kan de app het huidige accugebruik voor gegevens op laag niveau lezen. Een app kan hierdoor mogelijk gedetailleerde informatie achterhalen over de door u gebruikte apps."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"accustatistieken aanpassen"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Hiermee kan de app verzamelde accustatistieken wijzigen. Niet voor gebruik door normale apps."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"bewerkingsstatistieken van apps ophalen"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Hiermee kan de app verzamelde bewerkingsstatistieken van apps ophalen. Niet voor gebruik door normale apps."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"bewerkingsstatistieken van apps wijzigen"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Hiermee kan de app verzamelde bewerkingsstatistieken van apps wijzigen. Niet voor gebruik door normale apps."</string>
     <string name="permlab_backup" msgid="470013022865453920">"systeemback-up en -herstel beheren"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 8123bea..749a73e 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Przełącza menedżera aktywności w stan wyłączenia. Nie wykonuje pełnego wyłączenia."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zapobieganie przełączaniu aplikacji"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Uniemożliwia użytkownikowi przełączenie na inną aplikację."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorowanie i kontrolowanie wszystkich uruchamianych aplikacji"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Pozwala aplikacji na monitorowanie i kontrolowanie sposobu uruchamiania działań przez system. Złośliwe aplikacje mogą całkowicie naruszyć zabezpieczenia systemu. To uprawnienie nigdy nie jest potrzebne podczas normalnego użytkowania, a jedynie podczas programowania."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"wysyłanie transmisji informującej o usuniętym pakiecie"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Zezwala aplikacji na odczytywanie bieżących danych niskiego poziomu o wykorzystaniu baterii. Możliwe jest wtedy zbieranie przez aplikację szczegółowych danych o używanych aplikacjach."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"zmienianie statystyk dotyczących baterii"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Zezwala aplikacji na modyfikowanie zebranych statystyk dotyczących baterii. Nieprzeznaczone dla zwykłych aplikacji."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"pobieranie statystyk działania aplikacji"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Zezwala aplikacji na pobieranie zebranych statystyk działania aplikacji. Nieprzeznaczone dla zwykłych aplikacji."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modyfikowanie statystyk działania aplikacji"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Zezwala aplikacji na modyfikowanie zebranych statystyk działania aplikacji. Nieprzeznaczone dla zwykłych aplikacji."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolowanie tworzenia i przywracania kopii zapasowych systemu"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 66879ee..09a3d1f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Coloca o gestor de actividade num estado de encerramento. Não executa um encerramento completo."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"impedir trocas de aplicações"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impede que o utilizador mude para outra aplicação."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorizar e controlar a iniciação de todas as aplicações"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite que uma aplicação monitorize e controle a forma como o sistema inicia atividades. As aplicações maliciosas podem comprometer totalmente o sistema. Esta autorização só é necessária para programação, nunca para utilização normal."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar difusão de pacote removido"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que uma aplicação leia os atuais dados de utilização da bateria de baixo nível. Poderá permitir que a aplicação encontre informações detalhadas sobre as aplicações que utiliza."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estatísticas da bateria"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que a aplicação modifique as estatísticas recolhidas sobre a bateria. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"obter estatísticas de utilização da aplicação"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que a aplicação obtenha as estatísticas de utilização da aplicação recolhidas. Não se destina a utilização por aplicações normais."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estatísticas de utilização da aplicação"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que a aplicação modifique as estatísticas de utilização de aplicação recolhidas. Não se destina a utilização por aplicações normais."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar a cópia de segurança e restauro do sistema"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index b9167ef..3d5f68e 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Coloca o gerenciador de atividades em um estado de desligamento. Não executa o desligamento completo."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"evitar trocas de aplicativo"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impede que o usuário alterne para outro aplicativo."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorar e controlar todos os aplicativos que estão sendo iniciados"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite que o aplicativo monitore e controle a forma como o sistema inicia atividades. Aplicativos maliciosos podem comprometer completamente o sistema. Esta permissão só é necessária para o desenvolvimento, nunca para o uso normal."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar transmissão removida do pacote"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que o aplicativo leia os dados de uso da bateria de baixo nível atuais. Pode fornecer ao aplicativo informações detalhadas sobre os aplicativos usados por você."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estatísticas da bateria"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que o aplicativo modifique as estatísticas coletadas da bateria. Não deve ser usado em aplicativos normais."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperar estatísticas de operações de aplicativos"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que o aplicativo recupere as estatísticas de operações de aplicativos. Não deve ser usado em aplicativos normais."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estatísticas de operações de aplicativos"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que o aplicativo modifique as estatísticas de operações de aplicativos. Não deve ser usado em aplicativos normais."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar backup e restauração do sistema"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 8d8d882..8ee8779 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -449,6 +449,10 @@
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"evitar il midar tranter applicaziuns"</string>
     <!-- no translation found for permdesc_stopAppSwitches (8262195802582255021) -->
     <skip />
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <!-- no translation found for permlab_runSetActivityWatcher (892239094867182656) -->
     <skip />
     <!-- no translation found for permdesc_runSetActivityWatcher (6003603162578577406) -->
@@ -477,6 +481,10 @@
     <skip />
     <!-- no translation found for permdesc_updateBatteryStats (6862817857178025002) -->
     <skip />
+    <!-- no translation found for permlab_getAppOpsStats (1508779687436585744) -->
+    <skip />
+    <!-- no translation found for permdesc_getAppOpsStats (6243887041577912877) -->
+    <skip />
     <!-- no translation found for permlab_updateAppOpsStats (8829097373851521505) -->
     <skip />
     <!-- no translation found for permdesc_updateAppOpsStats (50784596594403483) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 30276cb..ecfef60 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Plasează Managerul de activităţi într-o stare de închidere. Nu efectuează o închidere completă."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"împiedicare comutare între aplicaţii"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Împiedică trecerea utilizatorului la o altă aplicaţie."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorizare şi control asupra lansării tuturor aplicaţiilor"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite aplicaţiei să monitorizeze şi să controleze modul în care sistemul lansează activităţi. Aplicaţiile rău intenţionate pot să compromită sistemul în întregime. Această permisiune este necesară doar pentru dezvoltare şi niciodată pentru utilizarea normală."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"trimitere mesaj difuzat privind extragerea din pachet"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite unei aplicaţii să citească datele actuale privind utilizarea la nivel redus a bateriei. Cu această permisiune, aplicaţia poate afla informaţii detaliate despre aplicaţiile pe care le utilizaţi."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modifică statistici referitoare la baterie"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite aplicaţiei să modifice statisticile colectate despre baterie. Nu se utilizează de aplicaţiile obişnuite."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"preluarea statisticilor privind operațiile aplicației"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite aplicației să preia statisticile colectate privind operațiile aplicației. Nu se utilizează de aplicațiile obișnuite."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificarea statisticilor privind utilizarea aplicației"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite aplicației să modifice statisticile colectate despre utilizarea aplicației. Nu se utilizează de aplicațiile obișnuite."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlare copiere de rezervă şi restabilire a sistemului"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index bbfd928..f2908f4 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Завершает работу диспетчера активности. Не выполняет полное завершение работы."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"запретить переключение приложений"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Запрещает пользователям переключаться между приложениями."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"отслеживание и управление запуском всех приложений"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Приложение сможет отслеживать запуск системных процессов и управлять им. Вредоносные программы смогут получить полный контроль над системой. Это разрешение необходимо только для разработки и не нужно в обычном режиме."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"отправлять рассылку об удалении пакета"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Разрешает приложению получать данные об использовании батареи на низшем уровне. В результате оно может иметь доступ к информации об используемых вами программах."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"изменять статистику батареи"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Приложение сможет изменять собранную статистику использования заряда батареи. Это разрешение не используется обычными приложениями."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"получать статистику операций в приложениях"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Приложение сможет получать собранную статистику операций в приложениях. Это разрешение не используется обычными программами."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"изменять статистику операций в приложениях"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Приложение сможет изменять собранную статистику операций в приложениях. Это разрешение не используется обычными приложениями."</string>
     <string name="permlab_backup" msgid="470013022865453920">"управление резервным копированием и восстановлением системы"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index c0147eb..9f6702b 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Uvedie správcu činností do vypnutého stavu. Úplné vypnutie však nenastane."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zabrániť prepínaniu aplikácií"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Zabráni používateľovi prepnúť na inú aplikáciu."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"sledovať a ovládať všetky spustenia aplikácií"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Umožňuje aplikácii sledovať a ovládať spúšťanie aktivít systémom. Škodlivé aplikácie môžu systém úplne ovládnuť. Toto povolenie je potrebné len na účely vývoja, nikdy nie na bežné používanie."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"odoslanie vysielania o odstránení balíčka"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Umožňuje aplikácii čítať aktuálne údaje nízkej úrovne o používaní batérie. Pomocou tejto funkcie môže aplikácia zistiť podrobnosti o tom, ktoré aplikácie používate."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"zmena štatistických údajov o batérii"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Umožňuje aplikácii zmeniť zhromaždené štatistické údaje o batérii. Bežné aplikácie toto nastavenie nepoužívajú."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"získať štatistické údaje o fungovaní aplikácií"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Umožňuje aplikácii získať zhromaždené štatistické údaje o fungovaní aplikácií. Bežné aplikácie toto nastavenie nepoužívajú."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"upraviť štatistické údaje o fungovaní aplikácií"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Umožňuje aplikácii zmeniť zhromaždené štatistické údaje o fungovaní aplikácií. Bežné aplikácie toto nastavenie nepoužívajú."</string>
     <string name="permlab_backup" msgid="470013022865453920">"Ovládať zálohovanie a obnovu systému"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 5e90928..20e23ce 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Upravitelja dejavnosti preklopi v stanje za zaustavitev. Ne izvede celotne zaustavitve."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"preprečevanje preklopa programov"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Uporabniku preprečuje preklop v drug program."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"spremljanje in nadzor vseh zagonov programov"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Programu omogoča spremljanje in nadziranje načina, kako sistem zažene dejavnosti. Zlonamerni programi lahko v celoti ogrozijo varnost sistema. To dovoljenje je potrebno samo za razvoj, vendar nikoli za običajno uporabo."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"pošiljanje oddaje brez paketa"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Aplikaciji omogoča branje podatkov o trenutni nizki napolnjenosti akumulatorja. Aplikaciji lahko tudi dovoli dostop do podrobnosti o tem, katere aplikacije uporabljate."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"spreminjanje statističnih podatkov o akumulatorju"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Aplikaciji omogoča spreminjanje zbranih statističnih podatkov o akumulatorju. Ni primerno za uporabo z običajnimi aplikacijami."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"pridobi statistične podatke o delovanju aplikacij"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Aplikaciji dovoli pridobivanje zbranih statističnih podatkov o delovanju aplikacij. Ni za uporabo v navadnih aplikacijah."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"spreminjanje statističnih podatkov o delovanju aplikacije"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Aplikaciji dovoli spreminjanje zbranih statističnih podatkov o delovanju aplikacij. Ni za uporabo v navadnih aplikacijah."</string>
     <string name="permlab_backup" msgid="470013022865453920">"nadzor varnostnega kopiranja sistema in obnovitev"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 736a545..b4f2096 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Ставља менаџера активности у стање искључивања. Не искључује га у потпуности."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"спречавање пребацивања са једне апликације на другу"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Спречава да корисник пређе на другу апликацију."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"надгледање и контрола покретања свих апликација"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Дозвољава апликацији да прати начин на који систем покреће активности и да њиме управља. Злонамерне апликације могу у потпуности да угрозе систем. Ова дозвола је потребна само за програмирање, а никада за уобичајено коришћење."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"слање емитовања уклоњеног пакета"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Дозвољава апликацији да чита опште податке о тренутној употреби батерије на измаку. Можда ће апликацији дозволити да сазна детаљне информације о томе које апликације користите."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"измена статистике о батерији"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Дозвољава апликацији да мења прикупљену статистику о батерији. Не користе је обичне апликације."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"преузимање статистике о функционисању апликације"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Дозвољава апликацији да преузима прикупљену статистику о функционисању апликације. Не користе је уобичајене апликације."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"измена статистике о функционисању апликације"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Дозвољава апликацији да измени прикупљену статистику о функционисању апликације. Не користе је уобичајене апликације."</string>
     <string name="permlab_backup" msgid="470013022865453920">"контрола резервне копије система и враћање почетних вредности"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index e975f68..f858d54 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Sätter aktivitetshanteraren i avstängningsläge. Utför inte en fullständig avstängning."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"förhindrar programbyten"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Hindrar användaren från att byta till en annan app."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"övervaka och styra alla appar som öppnas"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Tillåter att appen övervakar och styr hur systemet startar aktiviteter. Skadliga appar kan kompromettera systemet helt. Den här behörigheten behövs bara för programmering, aldrig för vanlig användning."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"skicka meddelande om borttaget paket"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Tillåter att en app läser de aktuella uppgifterna om låg batterianvändningsnivå. Appen kan tillåtas få reda på detaljerade uppgifter om vilka appar du använder."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ändra batteristatistik"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Tillåter att appen ändrar samlad batteristatistik. Används inte av vanliga appar."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"hämta åtgärdsstatistik för appar"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Tillåter att appen hämtar samlad åtgärdsstatistik för appar. Används inte av vanliga appar."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"ändra appars åtgärdsstatistik"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Tillåter att appen ändrar samlad åtgärdsstatistik för appar. Används inte av vanliga appar."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrollera säkerhetskopiering och återställning av systemet"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index fff8a16..4430ed5 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Huweka kisimamia shughuli katika hali ya kuzima. Haiadhiri uzimaji kamili"</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"zuia swichi za app"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Huzuia mtumiaji dhidi ya kubadilisha na kwenda kwa programu nyingine."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"Fuatilia na kudhibiti uzinduzi wote wa programu"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Inaruhusu programu kufuatilia na kudhibiti jinsi mfumo unazindua shughuli. Programu hasidi zinaweza kutia mfumo hatarini. Ruhusa inahitajika tu kwa usanidi, kamwe sio kwa matumizi ya kawaida."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"furushi lililotumwa limeondoa tangazo"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Inaruhusu programu kusoma data ya sasa ya matumizi ya kiwango cha chini cha betri. Huenda ikaruhusu kupata maelezo ya kina kuhusu programu unazozitumia."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"rekebisha takwimu za betri"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Inaruhusu programu kurekebisha takwimu za betri zilizokusanywa. Si ya kutumiwa na programu za kawaida."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"epua takwimu za oparesheni ya programu"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Inaruhusu programu kuepua takwimu za matumizi ya programu zilizokusanywa. Si ya kutumiwa na programu za kawaida."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"rekebisha takwimu za oparesheni ya programu"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Inaruhusu programu kurekebisha takwimu za matumizi ya programu zilizokusanywa. Si ya kutumiwa na programu za kawaida."</string>
     <string name="permlab_backup" msgid="470013022865453920">"Dhibiti kuhifadhi nakala na kurejesha kwa mfumo"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 96e03b1..1cad285 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"กำหนดให้ตัวจัดการกิจกรรมอยู่ในสถานะปิดระบบ โดยไม่ได้ปิดระบบอย่างสมบูรณ์"</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ป้องกันการเปลี่ยนแอปพลิเคชัน"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"ป้องกันไม่ให้ผู้ใช้สลับไปใช้แอปพลิเคชันอื่น"</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"ตรวจสอบและควบคุมแอปพลิเคชันทั้งหมดที่เปิดใช้งาน"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"อนุญาตให้แอปพลิเคชันตรวจสอบและควบคุมวิธีการที่ระบบเปิดกิจกรรมต่างๆ แอปพลิเคชันที่เป็นอันตรายอาจทำอันตรายแก่ระบบได้อย่างสิ้นเชิง การอนุญาตนี้จำเป็นสำหรับการพัฒนาเท่านั้น ไม่ใช้สำหรับแอปพลิเคชันทั่วไปโดยเด็ดขาด"</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"ส่งการกระจายข้อมูลว่ามีการนำแพคเกจออก"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลการใช้แบตเตอรี่ที่มีพลังงานเหลือน้อยในปัจจุบัน โดยอาจอนุญาตให้แอปพลิเคชันค้นหาข้อมูลรายละเอียดว่าคุณใช้งานแอปพลิเคชันใดบ้าง"</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"แก้ไขสถิติของแบตเตอรี่"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"อนุญาตให้แอปพลิเคชันแก้ไขสถิติของแบตเตอรี่่ที่เก็บรวบรวมไว้ ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"เรียกคืนสถิติการทำงานของแอปพลิเคชัน"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"อนุญาตให้แอปพลิเคชันเรียกคืนสถิติการทำงานของแอปพลิเคชันที่เก็บรวบรวมไว้ ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"แก้ไขสถิติการทำงานของแอปพลิเคชัน"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"อนุญาตให้แอปพลิเคชันแก้ไขสถิติการทำงานของแอปพลิเคชันที่เก็บรวบรวมไว้ ไม่ใช้สำหรับแอปพลิเคชันทั่วไป"</string>
     <string name="permlab_backup" msgid="470013022865453920">"ควบคุมการสำรองและคืนค่า"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 95d8cf2..6798be9 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Inilalagay ang tagapamahala ng aktibidad sa katayuan ng pag-shutdown. Hindi nagsasagawa ng kumpletong pag-shutdown."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"pigilan ang mga paglipat ng app"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Pinipigilan ang mga user sa paglipat sa isa pang app."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"subaybayan at kontrolin ang lahat ng paglunsad ng app"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Pinapayagan ang app na subaybayan at kontrolin kung paano naglulunsad ng mga aktibidad ang system. Maaaring ganap na ikompromiso ng nakakahamak na apps ang system. Kinakailangan lamang ang pahintulot na ito para sa pagpapabuti, hindi kailanman para sa normal na paggamit."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"magpadala ng package inalis ang broadcast"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Binibigyang-daan ang application na basahin ang kasalukuyang data sa paggamit ng mababang antas ng baterya. Maaaring bigyang-daan ang application na malaman ang detalyadong impormasyon tungkol sa kung aling apps ang ginagamit mo."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"baguhin ang mga istatistika ng baterya"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Binibigyang-daan ang app na baguhin ang mga nakolektang istatistika ng baterya. Hindi para sa paggamit ng normal na apps."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"bawiin ang mga istatistika ng pagpapagana ng app"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Binibigyang-daan ang app na bawiin ang mga nakolektang istatistika ng pagpapagana ng application. Hindi para sa paggamit ng normal na apps."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"baguhin ang mga istatistika ng pagpapatakbo ng app"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Binibigyang-daan ang app na baguhin ang mga nakolektang istatistika ng pagpapatakbo ng application. Hindi para sa paggamit ng normal na apps."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolin ang system backup at pagbawi"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 7308264..015fe1b 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Eylem yöneticisini kapalı duruma getirir. Tam kapatma işlemi gerçekleştirmez."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"uygulama değişimlerini engelle"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Kullanıcının başka bir uygulamaya geçiş yapmasını engeller."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"tüm uygulama başlatma işlemlerini izle ve denetle"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Uygulamaya, sistemin etkinlikleri nasıl başlattığını izleme ve denetleme izni verir. Kötü amaçlı uygulamalar sistemi tamamen tehlikeye atabilir. Bu izin normal kullanım için değildir, sadece geliştirme süreçlerinde kullanılır."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"paket ile kaldırılan yayını gönder"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Uygulamaya, mevcut pil kullanım verilerini alt düzeyde okuma izni verir. Uygulamanın hangi uygulamaları kullandığınızla ilgili ayrıntılı bilgi edinmesine olanak sağlayabilir."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"pil istatistiklerini değiştir"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Uygulamaya, toplanan pil kullanım istatistiklerini değiştirme izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"uygulama çalışma istatistiklerini al"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Uygulamaya, uygulama çalışma istatistiklerini alma izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"uygulama çalışma istatistiklerini değiştir"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Uygulamaya, uygulama çalışma istatistiklerini değiştirme izni verir. Normal uygulamaların kullanımına yönelik değildir."</string>
     <string name="permlab_backup" msgid="470013022865453920">"sistem yedeğini kontrol et ve geri yükle"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 17460f1..17f545c 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Переводить диспетчер дій у стан завершення роботи. Не виконує повне завершення роботи."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"запобіг. зміні програм"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Запобігати переходу користувача до іншої програми."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"відстежувати та контролювати запуски всіх програм"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Дозволяє програмі відстежувати та контролювати, як саме система запускає дії. Шкідливі програми можуть отримати повний контроль над системою. Цей дозвіл потрібний лише для розробки, а не для звичайного користування."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"надсил. запис про видал. пакета"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Дозволяє програмі зчитувати дані про поточний низький рівень споживання заряду акумулятора. Програма може отримувати докладну інформацію про те, якими програмами ви користуєтеся."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"змінювати статистику акумулятора"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Дозволяє програмі змінювати зібрану статистику акумулятора. Не для використання звичайними програмами."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"отримувати статистику роботи програми"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Дозволяє програмі отримувати зібрану статистику роботи програми. Не використовується звичайними програмами."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"змінювати статистику роботи програми"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Дозволяє програмі змінювати зібрану статистику роботи програми. Не використовується звичайними програмами."</string>
     <string name="permlab_backup" msgid="470013022865453920">"контр. резерв. копіюв. і відн. сист."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 148f4a8..d26ee14 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Đặt trình quản lý hoạt động sang trạng thái tắt. Không thực hiện tắt hoàn toàn."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"ngăn chuyển đổi ứng dụng"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Ngăn người dùng chuyển sang ứng dụng khác."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"giám sát và kiểm soát tất cả hoạt động khởi chạy ứng dụng"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Cho phép ứng dụng giám sát và kiểm soát cách hệ thống khởi chạy các hoạt động. Ứng dụng độc hại hoàn toàn có thể làm tổn hại hệ thống. Quyền này chỉ cần cho mục đích phát triển, không dành cho mục đích sử dụng thông thường."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"gửi truyền phát đã xóa của gói"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Cho phép ứng dụng đọc dữ liệu sử dụng pin mức thấp hiện tại. Có thể cho phép ứng dụng biết thông tin chi tiết về ứng dụng bạn sử dụng."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"sửa đổi số liệu thống kê về pin"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Cho phép ứng dụng sửa đổi các số liệu thống kê về pin đã được thu thập. Không dành cho các ứng dụng thông thường."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"truy xuất số liệu thống kê hoạt động của ứng dụng"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Cho phép ứng dụng truy xuất số liệu thống kê hoạt động của ứng dụng đã thu thập. Không dành cho ứng dụng thông thường."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"sửa đổi số liệu thống kê hoạt động của ứng dụng"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Cho phép ứng dụng sửa đổi số liệu thống kê hoạt động của ứng dụng đã thu thập. Không dành cho ứng dụng thông thường."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kiểm soát sao lưu và khôi phục hệ thống"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index fa43c99..87faf15 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"使活动管理器进入关闭状态。不执行彻底关机。"</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"禁止切换应用"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"阻止用户切换到其他应用。"</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"监控所有应用的启动"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"允许应用监视和控制系统是如何启动活动的。恶意应用可能会完全破坏系统。此权限只有在进行开发时才需要，正常使用情况下绝不需要。"</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"发送包删除的广播"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"允许应用读取当前电量使用情况的基础数据，此权限可让应用了解关于您使用了哪些应用的详细信息。"</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"修改电池使用统计信息"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"允许该应用修改收集到的电池统计信息。普通应用不应使用此权限。"</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"检索应用操作统计信息"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"允许该应用检索收集到的应用操作统计信息。普通应用不应使用此权限。"</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"修改应用操作统计信息"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"允许该应用修改收集到的应用操作统计信息。普通应用不应使用此权限。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"控制系统备份和还原"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 3bfed3c..6d1f3bd 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"讓活動管理員進入關機狀態，而不執行完整的關機程序。"</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"防止切換應用程式"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"防止使用者切換到其他應用程式。"</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"監視及控制所有應用程式的啟動程序"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"允許應用程式監視和控制系統啟動活動的方式。請注意，惡意應用程式可能利用此功能破壞整個系統。這個權限只有開發人員才需要，一般使用者不需使用這個權限。"</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"傳送程式已移除廣播"</string>
@@ -315,8 +319,10 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"允許應用程式讀取目前的低電量使用資料。應用程式可能藉此找到一些詳細資訊，例如您所使用的應用程式為何。"</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"修改電池使用統計資料"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"允許應用程式修改收集到的電池使用統計資料 (不建議一般應用程式使用)。"</string>
-    <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"修改應用程式作業統計資料"</string>
-    <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"允許應用程式修改收集到的應用程式作業統計資料 (不建議一般應用程式使用)。"</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"擷取應用程式作業統計資料"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"允許應用程式擷取收集到的應用程式作業統計資料 (不建議一般應用程式使用)。"</string>
+    <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"修改應用程式操作統計資料"</string>
+    <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"允許應用程式修改收集到的應用程式操作統計資料 (不建議一般應用程式使用)。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"控制系統備份與還原"</string>
     <string name="permdesc_backup" msgid="6912230525140589891">"允許應用程式控制系統備份與還原機制 (不建議一般應用程式使用)。"</string>
     <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"確認完整備份或還原作業"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 54be6ea..dafec7c 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -299,6 +299,10 @@
     <string name="permdesc_shutdown" msgid="7046500838746291775">"Ibeka imeneja yomsebenzi kwisimo sokuvala shaqa. Ayenzi ukuvala shaqa okuphelele."</string>
     <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"gwema ukushintsha kohlelo lokusebenza"</string>
     <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Igwema umsebenzisi ukuthi ashintshele kolunye uhlelo lokusebenza."</string>
+    <!-- no translation found for permlab_getTopActivityInfo (2537922311411546016) -->
+    <skip />
+    <!-- no translation found for permdesc_getTopActivityInfo (2512448855496067131) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"qapha futhi ulawule ukuqaliswa kwazo zonke izinsiza"</string>
     <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Ivumela insiza ukuthi ihlole futhi ilawule ukuthi isistimu iziqalisa kanjani izehlakalo. Izinzisa ezinobungozi zingensa isistimu ibe sebungozini. Lemvume idingakalela intuthuku kuphela hhay ukusetshenziswa okwejwayelekile."</string>
     <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"thumela iphakheji yomsakazo okhishiwe"</string>
@@ -315,6 +319,8 @@
     <string name="permdesc_batteryStats" msgid="5897346582882915114">"Ivumela uhlelo lokusebenza ukufunda idatha yokusebenza yebhethri leleveli ephansi yamanje. Ingavumela uhlelo lokusebenza ukuthola ulwazi lemininingwane mayelana nokuthi iziphi izinhlelo zokusebenza ozisebenzisayo."</string>
     <string name="permlab_updateBatteryStats" msgid="3719689764536379557">"guqula izibalo zebhetri"</string>
     <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Ivumela uhlelo lokusebenza ukuthi luguqule izibalo zebhethri eziqoqiwe. Akwenzelwe ukuthi kusetshenziswe izinhlelo zokusebenza ezijwayelekile."</string>
+    <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"thola izibalo zokusebenza kohlelo lokusebenza"</string>
+    <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Ivumela uhlelo lokusebenza ukuthi lithole izibalo zokusebenza kohlelo lokusebenza. Akumele kusetshenziswe izinhlelo zokusebenza ezijwayelekile."</string>
     <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"shintsha izinombolo zokusebenza zohlelo lokusebenza"</string>
     <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Ivumela uhlelo lokusebenza ukuthi lishintshe izinombolo zokusebenza kohlelo lokusebenza lokuqoqiwe. Akufanele kusetshenziswe izinhlelo zokusebenza ezijwayelekile."</string>
     <string name="permlab_backup" msgid="470013022865453920">"lawula ukusekela ngokulondoloza uhlelo bese ubuyisela esimweni"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index fa15324..dc921e6 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1541,6 +1541,7 @@
         <enum name="KEYCODE_YEN" value="216" />
         <enum name="KEYCODE_RO" value="217" />
         <enum name="KEYCODE_KANA" value="218" />
+        <enum name="KEYCODE_ASSIST" value="219" />
     </attr>
 
     <!-- ***************************************************************** -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7ef501f..ccdddd8 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -277,8 +277,6 @@
     <!-- Boolean indicating whether the wifi chipset has dual frequency band support -->
     <bool translatable="false" name="config_wifi_dual_band_support">false</bool>
 
-    <!-- Boolean indicating whether the wifi chipset has p2p support -->
-    <bool translatable="false" name="config_wifi_p2p_support">false</bool>
     <!-- Device type information conforming to Annex B format in WiFi Direct specification.
          The default represents a dual-mode smartphone -->
     <string translatable="false" name="config_wifi_p2p_device_type">10-0050F204-5</string>
@@ -537,12 +535,11 @@
 
     <!-- Control the behavior when the user long presses the home button.
             0 - Nothing
-            1 - Recent apps dialog
-            2 - Recent apps view in SystemUI
+            1 - Recent apps view in SystemUI
          This needs to match the constants in
          policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
     -->
-    <integer name="config_longPressOnHomeBehavior">2</integer>
+    <integer name="config_longPressOnHomeBehavior">1</integer>
 
     <!-- Array of light sensor LUX values to define our levels for auto backlight brightness support.
          The N entries of this array define N + 1 control points as follows:
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index fa26089..7f0fc0b 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -784,6 +784,12 @@
         another app.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permlab_getTopActivityInfo">get current app info</string>
+    <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+    <string name="permdesc_getTopActivityInfo">Allows the holder to retrieve private information
+        about the current application in the foreground of the screen.</string>
+    
+    <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_runSetActivityWatcher">monitor and control all app launching</string>
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permdesc_runSetActivityWatcher">Allows the app to
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6db89d9..412d4b9 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1113,6 +1113,7 @@
   <java-symbol type="layout" name="keyguard_multi_user_selector_widget" />
   <java-symbol type="layout" name="sms_short_code_confirmation_dialog" />
   <java-symbol type="layout" name="keyguard_add_widget" />
+  <java-symbol type="layout" name="action_bar_up_container" />
 
   <java-symbol type="anim" name="slide_in_child_bottom" />
   <java-symbol type="anim" name="slide_in_right" />
@@ -1337,7 +1338,6 @@
   <java-symbol type="id" name="sliding_layout" />
   <java-symbol type="id" name="keyguard_add_widget" />
   <java-symbol type="id" name="keyguard_add_widget_view" />
-  <java-symbol type="id" name="sliding_layout" />
   <java-symbol type="id" name="multi_pane_challenge" />
   <java-symbol type="id" name="keyguard_user_selector" />
   <java-symbol type="id" name="key_enter" />
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index 41f8536..f8b26bc 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -1241,13 +1241,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="android.accessibilityservice.InterrogationActivity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
-            </intent-filter>
-        </activity>
-
         <activity android:name="android.animation.BasicAnimatorActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivity.java b/core/tests/coretests/src/android/accessibilityservice/InterrogationActivity.java
deleted file mode 100644
index a9f144b..0000000
--- a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivity.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * 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 android.accessibilityservice;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-
-import com.android.frameworks.coretests.R;
-
-/**
- * Activity for testing the accessibility APIs for "interrogation" of
- * the screen content. These APIs allow exploring the screen and
- * requesting an action to be performed on a given view from an
- * AccessiiblityService.
- */
-public class InterrogationActivity extends Activity {
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.interrogation_activity);
-
-        findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
-            public void onClick(View v) {
-                /* do nothing */
-            }
-        });
-        findViewById(R.id.button5).setOnLongClickListener(new View.OnLongClickListener() {
-            public boolean onLongClick(View v) {
-                return true;
-            }
-        });
-    }
-}
diff --git a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java b/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java
deleted file mode 100644
index 3dc140b..0000000
--- a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/**
- * 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 android.accessibilityservice;
-
-import static android.view.accessibility.AccessibilityNodeInfo.ACTION_FOCUS;
-import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_FOCUS;
-import static android.view.accessibility.AccessibilityNodeInfo.ACTION_SELECT;
-import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_SELECTION;
-
-import android.graphics.Rect;
-import android.os.SystemClock;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityNodeInfo;
-
-import com.android.frameworks.coretests.R;
-import com.android.internal.util.Predicate;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-
-/**
- * Activity for testing the accessibility APIs for "interrogation" of
- * the screen content. These APIs allow exploring the screen and
- * requesting an action to be performed on a given view from an
- * AccessiiblityService.
- */
-public class InterrogationActivityTest
-        extends ActivityInstrumentationTestCase2<InterrogationActivity> {
-    private static final boolean DEBUG = false;
-
-    private static String LOG_TAG = "InterrogationActivityTest";
-
-    // Timeout for the accessibility state of an Activity to be fully initialized.
-    private static final int TIMEOUT_PROPAGATE_ACCESSIBILITY_EVENT_MILLIS = 5000;
-
-    // Timeout for which non getting accessibility events considers the app idle.
-    private static final long IDLE_EVENT_TIME_DELTA_MILLIS = 200;
-
-    // Timeout in which to wait for idle device.
-    private static final long GLOBAL_IDLE_DETECTION_TIMEOUT_MILLIS = 1000;
-
-    // Handle to a connection to the AccessibilityManagerService
-    private UiTestAutomationBridge mUiTestAutomationBridge;
-
-    public InterrogationActivityTest() {
-        super(InterrogationActivity.class);
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        mUiTestAutomationBridge = new UiTestAutomationBridge();
-        mUiTestAutomationBridge.connect();
-        mUiTestAutomationBridge.waitForIdle(IDLE_EVENT_TIME_DELTA_MILLIS,
-                GLOBAL_IDLE_DETECTION_TIMEOUT_MILLIS);
-        mUiTestAutomationBridge.executeCommandAndWaitForAccessibilityEvent(new Runnable() {
-                // wait for the first accessibility event
-                @Override
-                public void run() {
-                    // bring up the activity
-                    getActivity();
-                }
-            },
-            new Predicate<AccessibilityEvent>() {
-                @Override
-                public boolean apply(AccessibilityEvent event) {
-                    return (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
-                            && event.getPackageName().equals(getActivity().getPackageName()));
-                }
-            },
-            TIMEOUT_PROPAGATE_ACCESSIBILITY_EVENT_MILLIS);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        mUiTestAutomationBridge.disconnect();
-        super.tearDown();
-    }
-
-    @LargeTest
-    public void testFindAccessibilityNodeInfoByViewId() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertNotNull(button);
-            assertEquals(0, button.getChildCount());
-
-            // bounds
-            Rect bounds = new Rect();
-            button.getBoundsInParent(bounds);
-            assertEquals(0, bounds.left);
-            assertEquals(0, bounds.top);
-            assertEquals(160, bounds.right);
-            assertEquals(100, bounds.bottom);
-
-            // char sequence attributes
-            assertEquals("com.android.frameworks.coretests", button.getPackageName());
-            assertEquals("android.widget.Button", button.getClassName());
-            assertEquals("Button5", button.getText());
-            assertNull(button.getContentDescription());
-
-            // boolean attributes
-            assertTrue(button.isFocusable());
-            assertTrue(button.isClickable());
-            assertTrue(button.isEnabled());
-            assertFalse(button.isFocused());
-            assertTrue(button.isClickable());
-            assertFalse(button.isPassword());
-            assertFalse(button.isSelected());
-            assertFalse(button.isCheckable());
-            assertFalse(button.isChecked());
-
-            // actions
-            assertEquals(ACTION_FOCUS | ACTION_SELECT | ACTION_CLEAR_SELECTION,
-                button.getActions());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testFindAccessibilityNodeInfoByViewId: "
-                        + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testFindAccessibilityNodeInfoByViewText() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view by text
-            List<AccessibilityNodeInfo> buttons = mUiTestAutomationBridge
-                .findAccessibilityNodeInfosByTextInActiveWindow("butto");
-            assertEquals(9, buttons.size());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testFindAccessibilityNodeInfoByViewText: "
-                        + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testFindAccessibilityNodeInfoByViewTextContentDescription() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view by text
-            List<AccessibilityNodeInfo> buttons = mUiTestAutomationBridge
-                .findAccessibilityNodeInfosByTextInActiveWindow("contentDescription");
-            assertEquals(1, buttons.size());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testFindAccessibilityNodeInfoByViewTextContentDescription: "
-                        + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testTraverseAllViews() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // make list of expected nodes
-            List<String> classNameAndTextList = new ArrayList<String>();
-            classNameAndTextList.add("android.widget.LinearLayout");
-            classNameAndTextList.add("android.widget.LinearLayout");
-            classNameAndTextList.add("android.widget.LinearLayout");
-            classNameAndTextList.add("android.widget.LinearLayout");
-            classNameAndTextList.add("android.widget.ButtonButton1");
-            classNameAndTextList.add("android.widget.ButtonButton2");
-            classNameAndTextList.add("android.widget.ButtonButton3");
-            classNameAndTextList.add("android.widget.ButtonButton4");
-            classNameAndTextList.add("android.widget.ButtonButton5");
-            classNameAndTextList.add("android.widget.ButtonButton6");
-            classNameAndTextList.add("android.widget.ButtonButton7");
-            classNameAndTextList.add("android.widget.ButtonButton8");
-            classNameAndTextList.add("android.widget.ButtonButton9");
-
-            AccessibilityNodeInfo root = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.root);
-            assertNotNull("We must find the existing root.", root);
-
-            Queue<AccessibilityNodeInfo> fringe = new LinkedList<AccessibilityNodeInfo>();
-            fringe.add(root);
-
-            // do a BFS traversal and check nodes
-            while (!fringe.isEmpty()) {
-                AccessibilityNodeInfo current = fringe.poll();
-
-                CharSequence className = current.getClassName();
-                CharSequence text = current.getText();
-                String receivedClassNameAndText = className.toString()
-                   + ((text != null) ? text.toString() : "");
-                String expectedClassNameAndText = classNameAndTextList.remove(0);
-
-                assertEquals("Did not get the expected node info",
-                        expectedClassNameAndText, receivedClassNameAndText);
-
-                final int childCount = current.getChildCount();
-                for (int i = 0; i < childCount; i++) {
-                    AccessibilityNodeInfo child = current.getChild(i);
-                    fringe.add(child);
-                }
-            }
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testTraverseAllViews: " + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testPerformAccessibilityActionFocus() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view and make sure it is not focused
-            AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isFocused());
-
-            // focus the view
-            assertTrue(button.performAction(ACTION_FOCUS));
-
-            // find the view again and make sure it is focused
-            button = mUiTestAutomationBridge
-                    .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertTrue(button.isFocused());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testPerformAccessibilityActionFocus: " + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testPerformAccessibilityActionClearFocus() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view and make sure it is not focused
-            AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isFocused());
-
-            // focus the view
-            assertTrue(button.performAction(ACTION_FOCUS));
-
-            // find the view again and make sure it is focused
-            button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertTrue(button.isFocused());
-
-            // unfocus the view
-            assertTrue(button.performAction(ACTION_CLEAR_FOCUS));
-
-            // find the view again and make sure it is not focused
-            button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isFocused());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testPerformAccessibilityActionClearFocus: "
-                        + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testPerformAccessibilityActionSelect() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view and make sure it is not selected
-            AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isSelected());
-
-            // select the view
-            assertTrue(button.performAction(ACTION_SELECT));
-
-            // find the view again and make sure it is selected
-            button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertTrue(button.isSelected());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testPerformAccessibilityActionSelect: " + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testPerformAccessibilityActionClearSelection() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view and make sure it is not selected
-            AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isSelected());
-
-            // select the view
-            assertTrue(button.performAction(ACTION_SELECT));
-
-            // find the view again and make sure it is selected
-            button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertTrue(button.isSelected());
-
-            // unselect the view
-            assertTrue(button.performAction(ACTION_CLEAR_SELECTION));
-
-            // find the view again and make sure it is not selected
-            button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isSelected());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testPerformAccessibilityActionClearSelection: "
-                        + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testAccessibilityEventGetSource() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view and make sure it is not focused
-            final AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertFalse(button.isFocused());
-
-            AccessibilityEvent event = mUiTestAutomationBridge
-                    .executeCommandAndWaitForAccessibilityEvent(new Runnable() {
-                @Override
-                public void run() {
-                    // focus the view
-                    assertTrue(button.performAction(ACTION_FOCUS));
-                }
-            },
-            new Predicate<AccessibilityEvent>() {
-                @Override
-                public boolean apply(AccessibilityEvent event) {
-                    return (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED
-                            && event.getPackageName().equals(getActivity().getPackageName())
-                            && event.getText().get(0).equals(button.getText()));
-                }
-            },
-            TIMEOUT_PROPAGATE_ACCESSIBILITY_EVENT_MILLIS);
-
-            // check the last event
-            assertNotNull(event);
-
-            // check that last event source
-            AccessibilityNodeInfo source = event.getSource();
-            assertNotNull(source);
-
-            // bounds
-            Rect buttonBounds = new Rect();
-            button.getBoundsInParent(buttonBounds);
-            Rect sourceBounds = new Rect();
-            source.getBoundsInParent(sourceBounds);
-
-            assertEquals(buttonBounds.left, sourceBounds.left);
-            assertEquals(buttonBounds.right, sourceBounds.right);
-            assertEquals(buttonBounds.top, sourceBounds.top);
-            assertEquals(buttonBounds.bottom, sourceBounds.bottom);
-
-            // char sequence attributes
-            assertEquals(button.getPackageName(), source.getPackageName());
-            assertEquals(button.getClassName(), source.getClassName());
-            assertEquals(button.getText(), source.getText());
-            assertSame(button.getContentDescription(), source.getContentDescription());
-
-            // boolean attributes
-            assertSame(button.isFocusable(), source.isFocusable());
-            assertSame(button.isClickable(), source.isClickable());
-            assertSame(button.isEnabled(), source.isEnabled());
-            assertNotSame(button.isFocused(), source.isFocused());
-            assertSame(button.isLongClickable(), source.isLongClickable());
-            assertSame(button.isPassword(), source.isPassword());
-            assertSame(button.isSelected(), source.isSelected());
-            assertSame(button.isCheckable(), source.isCheckable());
-            assertSame(button.isChecked(), source.isChecked());
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testAccessibilityEventGetSource: " + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testObjectContract() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // find a view and make sure it is not focused
-            AccessibilityNodeInfo button = mUiTestAutomationBridge
-                .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.button5);
-            assertNotNull(button);
-            AccessibilityNodeInfo parent = button.getParent();
-            final int childCount = parent.getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                AccessibilityNodeInfo child = parent.getChild(i);
-                assertNotNull(child);
-                if (child.equals(button)) {
-                    assertEquals("Equal objects must have same hasCode.", button.hashCode(),
-                            child.hashCode());
-                    return;
-                }
-            }
-            fail("Parent's children do not have the info whose parent is the parent.");
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testObjectContract: " + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-
-    @LargeTest
-    public void testGetRootAccessibilityNodeInfoInActiveWindow() throws Exception {
-        final long startTimeMillis = SystemClock.uptimeMillis();
-        try {
-            // get the root via the designated API
-            AccessibilityNodeInfo fetched = mUiTestAutomationBridge
-                    .getRootAccessibilityNodeInfoInActiveWindow();
-            assertNotNull(fetched);
-
-            // get the root via traversal
-            AccessibilityNodeInfo expected = mUiTestAutomationBridge
-                    .findAccessibilityNodeInfoByViewIdInActiveWindow(R.id.root);
-            while (true) {
-                AccessibilityNodeInfo parent = expected.getParent();
-                if (parent == null) {
-                    break;
-                }
-                expected = parent;
-            }
-            assertNotNull(expected);
-
-            assertEquals("The node with id \"root\" should be the root.", expected, fetched);
-        } finally {
-            if (DEBUG) {
-                final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
-                Log.i(LOG_TAG, "testGetRootAccessibilityNodeInfoInActiveWindow: "
-                        + elapsedTimeMillis + "ms");
-            }
-        }
-    }
-}
diff --git a/core/tests/inputmethodtests/Android.mk b/core/tests/inputmethodtests/Android.mk
new file mode 100644
index 0000000..4631e65
--- /dev/null
+++ b/core/tests/inputmethodtests/Android.mk
@@ -0,0 +1,18 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+# We only want this apk build for tests.
+LOCAL_MODULE_TAGS := tests
+
+# Include all test java files.
+LOCAL_SRC_FILES := \
+	$(call all-java-files-under, src)
+
+LOCAL_DX_FLAGS := --core-library
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests android-common frameworks-core-util-lib
+LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_PACKAGE_NAME := FrameworksCoreInputMethodTests
+
+LOCAL_CERTIFICATE := platform
+
+include $(BUILD_PACKAGE)
diff --git a/core/tests/inputmethodtests/AndroidManifest.xml b/core/tests/inputmethodtests/AndroidManifest.xml
new file mode 100644
index 0000000..7f0b1aa
--- /dev/null
+++ b/core/tests/inputmethodtests/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          android:installLocation="internalOnly"
+          package="com.android.frameworks.coretests.inputmethod"
+          android:sharedUserId="android.uid.system">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+            android:targetPackage="com.android.frameworks.coretests.inputmethod"
+            android:label="Frameworks InputMethod Core Tests" />
+
+</manifest>
diff --git a/core/tests/inputmethodtests/run_core_inputmethod_test.sh b/core/tests/inputmethodtests/run_core_inputmethod_test.sh
new file mode 100755
index 0000000..5e123ec
--- /dev/null
+++ b/core/tests/inputmethodtests/run_core_inputmethod_test.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+while [[ $# -gt 0 ]]; do
+  case "$1" in
+  --rebuild ) echo Rebuild && rebuild=true;;
+  * ) com_opts+=($1);;
+  esac
+  shift
+done
+
+if [[ -z $ANDROID_PRODUCT_OUT && $rebuilld == true ]]; then
+  echo You must lunch before running this test.
+  exit 0
+fi
+
+if [[ $rebuild == true ]]; then
+  make -j4 FrameworksCoreInputMethodTests
+  TESTAPP=${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreInputMethodTests.apk
+  COMMAND="adb install -r $TESTAPP"
+  echo $COMMAND
+  $COMMAND
+fi
+
+adb shell am instrument -w -e class android.os.InputMethodTest com.android.frameworks.coretests.inputmethod/android.test.InstrumentationTestRunner
diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
new file mode 100644
index 0000000..0a2b50c
--- /dev/null
+++ b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2013 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.os;
+
+import com.android.internal.inputmethod.InputMethodUtils;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class InputMethodTest extends InstrumentationTestCase {
+    private static final boolean IS_AUX = true;
+    private static final boolean IS_DEFAULT = true;
+    private static final boolean IS_AUTO = true;
+
+    @SmallTest
+    public void testDefaultEnabledImesWithDefaultVoiceIme() throws Exception {
+        final Context context = getInstrumentation().getTargetContext();
+        final ArrayList<InputMethodInfo> imis = new ArrayList<InputMethodInfo>();
+        imis.add(createDefaultAutoDummyVoiceIme());
+        imis.add(createNonDefaultAutoDummyVoiceIme0());
+        imis.add(createNonDefaultAutoDummyVoiceIme1());
+        imis.add(createNonDefaultDummyVoiceIme2());
+        imis.add(createDefaultDummyEnUSKeyboardIme());
+        imis.add(createNonDefaultDummyJaJPKeyboardIme());
+        final ArrayList<InputMethodInfo> enabledImis = InputMethodUtils.getDefaultEnabledImes(
+                context, true, imis);
+        assertEquals(2, enabledImis.size());
+        for (int i = 0; i < enabledImis.size(); ++i) {
+            final InputMethodInfo imi = enabledImis.get(0);
+            // "DummyDefaultAutoVoiceIme" and "DummyDefaultEnKeyboardIme"
+            if (imi.getPackageName().equals("DummyDefaultAutoVoiceIme")
+                    || imi.getPackageName().equals("DummyDefaultEnKeyboardIme")) {
+                continue;
+            } else {
+                fail("Invalid enabled subtype.");
+            }
+        }
+    }
+
+    @SmallTest
+    public void testDefaultEnabledImesWithOutDefaultVoiceIme() throws Exception {
+        final Context context = getInstrumentation().getTargetContext();
+        final ArrayList<InputMethodInfo> imis = new ArrayList<InputMethodInfo>();
+        imis.add(createNonDefaultAutoDummyVoiceIme0());
+        imis.add(createNonDefaultAutoDummyVoiceIme1());
+        imis.add(createNonDefaultDummyVoiceIme2());
+        imis.add(createDefaultDummyEnUSKeyboardIme());
+        imis.add(createNonDefaultDummyJaJPKeyboardIme());
+        final ArrayList<InputMethodInfo> enabledImis = InputMethodUtils.getDefaultEnabledImes(
+                context, true, imis);
+        assertEquals(3, enabledImis.size());
+        for (int i = 0; i < enabledImis.size(); ++i) {
+            final InputMethodInfo imi = enabledImis.get(0);
+            // "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1" and
+            // "DummyDefaultEnKeyboardIme"
+            if (imi.getPackageName().equals("DummyNonDefaultAutoVoiceIme0")
+                    || imi.getPackageName().equals("DummyNonDefaultAutoVoiceIme1")
+                    || imi.getPackageName().equals("DummyDefaultEnKeyboardIme")) {
+                continue;
+            } else {
+                fail("Invalid enabled subtype.");
+            }
+        }
+    }
+
+    private static InputMethodInfo createDummyInputMethodInfo(String packageName, String name,
+            CharSequence label, boolean isAuxIme, boolean isDefault,
+            List<InputMethodSubtype> subtypes) {
+        final ResolveInfo ri = new ResolveInfo();
+        final ServiceInfo si = new ServiceInfo();
+        final ApplicationInfo ai = new ApplicationInfo();
+        ai.packageName = packageName;
+        ai.enabled = true;
+        ai.flags |= ApplicationInfo.FLAG_SYSTEM;
+        si.applicationInfo = ai;
+        si.enabled = true;
+        si.packageName = packageName;
+        si.name = name;
+        si.exported = true;
+        si.nonLocalizedLabel = label;
+        ri.serviceInfo = si;
+        return new InputMethodInfo(ri, isAuxIme, "", subtypes, 1, isDefault);
+    }
+
+    private static InputMethodSubtype createDummyInputMethodSubtype(String locale, String mode,
+            boolean isAuxiliary, boolean overridesImplicitlyEnabledSubtype) {
+        return new InputMethodSubtype(0, 0, locale, mode, "", isAuxiliary,
+                overridesImplicitlyEnabledSubtype);
+    }
+
+    private static InputMethodInfo createDefaultAutoDummyVoiceIme() {
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
+        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
+        return createDummyInputMethodInfo("DummyDefaultAutoVoiceIme", "dummy.voice0",
+                "DummyVoice0", IS_AUX, IS_DEFAULT, subtypes);
+    }
+
+    private static InputMethodInfo createNonDefaultAutoDummyVoiceIme0() {
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
+        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
+        return createDummyInputMethodInfo("DummyNonDefaultAutoVoiceIme0", "dummy.voice1",
+                "DummyVoice1", IS_AUX, !IS_DEFAULT, subtypes);
+    }
+
+    private static InputMethodInfo createNonDefaultAutoDummyVoiceIme1() {
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+        subtypes.add(createDummyInputMethodSubtype("auto", "voice", IS_AUX, IS_AUTO));
+        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
+        return createDummyInputMethodInfo("DummyNonDefaultAutoVoiceIme1", "dummy.voice2",
+                "DummyVoice2", IS_AUX, !IS_DEFAULT, subtypes);
+    }
+
+    private static InputMethodInfo createNonDefaultDummyVoiceIme2() {
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+        subtypes.add(createDummyInputMethodSubtype("en_US", "voice", IS_AUX, !IS_AUTO));
+        return createDummyInputMethodInfo("DummyNonDefaultVoiceIme2", "dummy.voice3",
+                "DummyVoice3", IS_AUX, !IS_DEFAULT, subtypes);
+    }
+
+    private static InputMethodInfo createDefaultDummyEnUSKeyboardIme() {
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+        subtypes.add(createDummyInputMethodSubtype("en_US", "keyboard", !IS_AUX, !IS_AUTO));
+        return createDummyInputMethodInfo("DummyDefaultEnKeyboardIme", "dummy.keyboard0",
+                "DummyKeyboard0", !IS_AUX, IS_DEFAULT, subtypes);
+    }
+
+    private static InputMethodInfo createNonDefaultDummyJaJPKeyboardIme() {
+        final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
+        subtypes.add(createDummyInputMethodSubtype("ja_JP", "keyboard", !IS_AUX, !IS_AUTO));
+        return createDummyInputMethodInfo("DummyNonDefaultJaJPKeyboardIme", "dummy.keyboard1",
+                "DummyKeyboard1", !IS_AUX, !IS_DEFAULT, subtypes);
+    }
+}
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 83ecdd9..cf04b5c 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -106,6 +106,10 @@
         <group gid="net_bw_acct" />
     </permission>
 
+    <permission name="android.permission.LOOP_RADIO" >
+        <group gid="loop_radio" />
+    </permission>
+
     <!-- ================================================================== -->
     <!-- ================================================================== -->
     <!-- ================================================================== -->
diff --git a/graphics/java/android/renderscript/Matrix3f.java b/graphics/java/android/renderscript/Matrix3f.java
index 66f2c81..5e9a7ca 100644
--- a/graphics/java/android/renderscript/Matrix3f.java
+++ b/graphics/java/android/renderscript/Matrix3f.java
@@ -138,9 +138,9 @@
         mMat[6] =  zx*nc + ys;
         mMat[1] =  xy*nc + zs;
         mMat[4] = y*y*nc +  c;
-        mMat[9] =  yz*nc - xs;
+        mMat[7] =  yz*nc - xs;
         mMat[2] =  zx*nc - ys;
-        mMat[6] =  yz*nc + xs;
+        mMat[5] =  yz*nc + xs;
         mMat[8] = z*z*nc +  c;
     }
 
diff --git a/keystore/java/android/security/AndroidKeyStore.java b/keystore/java/android/security/AndroidKeyStore.java
index aabfcae..65d7b8f 100644
--- a/keystore/java/android/security/AndroidKeyStore.java
+++ b/keystore/java/android/security/AndroidKeyStore.java
@@ -16,9 +16,8 @@
 
 package android.security;
 
-import org.apache.harmony.xnet.provider.jsse.OpenSSLDSAPrivateKey;
 import org.apache.harmony.xnet.provider.jsse.OpenSSLEngine;
-import org.apache.harmony.xnet.provider.jsse.OpenSSLRSAPrivateKey;
+import org.apache.harmony.xnet.provider.jsse.OpenSSLKeyHolder;
 
 import android.util.Log;
 
@@ -210,10 +209,8 @@
         byte[] keyBytes = null;
 
         final String pkeyAlias;
-        if (key instanceof OpenSSLRSAPrivateKey) {
-            pkeyAlias = ((OpenSSLRSAPrivateKey) key).getPkeyAlias();
-        } else if (key instanceof OpenSSLDSAPrivateKey) {
-            pkeyAlias = ((OpenSSLDSAPrivateKey) key).getPkeyAlias();
+        if (key instanceof OpenSSLKeyHolder) {
+            pkeyAlias = ((OpenSSLKeyHolder) key).getOpenSSLKey().getAlias();
         } else {
             pkeyAlias = null;
         }
diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h
index a551b3f..e8a85fd 100644
--- a/libs/hwui/Layer.h
+++ b/libs/hwui/Layer.h
@@ -277,6 +277,10 @@
      * Texture coordinates of the layer.
      */
     Rect texCoords;
+    /**
+     * Clipping rectangle.
+     */
+    Rect clipRect;
 
     /**
      * Dirty region indicating what parts of the layer
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index 61bedbb..c8a8ed4 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -62,6 +62,7 @@
         android::Rect r(dirty.left, dirty.top, dirty.right, dirty.bottom);
         mLayer->region.subtractSelf(r);
     }
+    mLayer->clipRect.set(dirty);
 
     return OpenGLRenderer::prepareDirty(dirty.left, dirty.top, dirty.right, dirty.bottom, opaque);
 }
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index c9e51bb..7772f3a 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -169,8 +169,8 @@
     return prepareDirty(0.0f, 0.0f, mWidth, mHeight, opaque);
 }
 
-status_t OpenGLRenderer::prepareDirty(float left, float top, float right, float bottom,
-        bool opaque) {
+status_t OpenGLRenderer::prepareDirty(float left, float top,
+        float right, float bottom, bool opaque) {
     mCaches.clearGarbage();
 
     mSnapshot = new Snapshot(mFirstSnapshot,
@@ -207,7 +207,7 @@
     if (mCaches.extensions.hasDiscardFramebuffer() &&
             left <= 0.0f && top <= 0.0f && right >= mWidth && bottom >= mHeight) {
         const GLenum attachments[] = { getTargetFbo() == 0 ? (const GLenum) GL_COLOR_EXT :
-                (const GLenum) GL_COLOR_ATTACHMENT0 };
+                (const GLenum) GL_COLOR_ATTACHMENT0, GL_STENCIL_EXT };
         glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, attachments);
     }
 }
@@ -237,12 +237,18 @@
 void OpenGLRenderer::startTiling(const sp<Snapshot>& s, bool opaque) {
     if (!mSuppressTiling) {
         Rect* clip = mTilingSnapshot->clipRect;
-        if (s->flags & Snapshot::kFlagIsFboLayer) {
-            clip = s->clipRect;
+        if (s->flags & Snapshot::kFlagFboTarget) {
+            clip = &s->layer->clipRect;
         }
 
-        mCaches.startTiling(clip->left, s->height - clip->bottom,
-                clip->right - clip->left, clip->bottom - clip->top, opaque);
+        startTiling(*clip, s->height, opaque);
+    }
+}
+
+void OpenGLRenderer::startTiling(const Rect& clip, int windowHeight, bool opaque) {
+    if (!mSuppressTiling) {
+        mCaches.startTiling(clip.left, windowHeight - clip.bottom,
+                    clip.right - clip.left, clip.bottom - clip.top, opaque);
     }
 }
 
@@ -782,18 +788,17 @@
 }
 
 bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo) {
+    layer->clipRect.set(clip);
     layer->setFbo(mCaches.fboCache.get());
 
     mSnapshot->region = &mSnapshot->layer->region;
-    mSnapshot->flags |= Snapshot::kFlagFboTarget;
-
-    mSnapshot->flags |= Snapshot::kFlagIsFboLayer;
+    mSnapshot->flags |= Snapshot::kFlagFboTarget | Snapshot::kFlagIsFboLayer |
+            Snapshot::kFlagDirtyOrtho;
     mSnapshot->fbo = layer->getFbo();
     mSnapshot->resetTransform(-bounds.left, -bounds.top, 0.0f);
     mSnapshot->resetClip(clip.left, clip.top, clip.right, clip.bottom);
     mSnapshot->viewport.set(0.0f, 0.0f, bounds.getWidth(), bounds.getHeight());
     mSnapshot->height = bounds.getHeight();
-    mSnapshot->flags |= Snapshot::kFlagDirtyOrtho;
     mSnapshot->orthoMatrix.load(mOrthoMatrix);
 
     endTiling();
@@ -811,7 +816,7 @@
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
             layer->getTexture(), 0);
 
-    startTiling(mSnapshot);
+    startTiling(mSnapshot, !layer->isBlend());
 
     // Clear the FBO, expand the clear region by 1 to get nice bilinear filtering
     mCaches.enableScissor();
@@ -1245,6 +1250,11 @@
 void OpenGLRenderer::attachStencilBufferToLayer(Layer* layer) {
     // The layer's FBO is already bound when we reach this stage
     if (!layer->getStencilRenderBuffer()) {
+        // GL_QCOM_tiled_rendering doesn't like it if a renderbuffer
+        // is attached after we initiated tiling. We must turn it off,
+        // attach the new render buffer then turn tiling back on
+        endTiling();
+
         // TODO: See Layer::removeFbo(). The stencil renderbuffer should be cached
         GLuint buffer;
         glGenRenderbuffers(1, &buffer);
@@ -1254,6 +1264,8 @@
         layer->allocateStencilRenderBuffer();
 
         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, buffer);
+
+        startTiling(layer->clipRect, layer->layer.getHeight(), !layer->isBlend());
     }
 }
 
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index d4e1eb5..594580e 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -400,12 +400,21 @@
 
     /**
      * Tells the GPU what part of the screen is about to be redrawn.
+     * This method will use the clip rect that we started drawing the
+     * frame with.
      * This method needs to be invoked every time getTargetFbo() is
      * bound again.
      */
     void startTiling(const sp<Snapshot>& snapshot, bool opaque = false);
 
     /**
+     * Tells the GPU what part of the screen is about to be redrawn.
+     * This method needs to be invoked every time getTargetFbo() is
+     * bound again.
+     */
+    void startTiling(const Rect& clip, int windowHeight, bool opaque = false);
+
+    /**
      * Tells the GPU that we are done drawing the frame or that we
      * are switching to another render target.
      */
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index 9b32667..f70110c 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -91,6 +91,7 @@
     private boolean mHasAccuracy = false;
     private float mAccuracy = 0.0f;
     private Bundle mExtras = null;
+    private boolean mIsFromMockProvider = false;
 
     // Cache the inputs and outputs of computeDistanceAndBearing
     // so calls to distanceTo() and bearingTo() can share work
@@ -140,6 +141,7 @@
         mHasAccuracy = l.mHasAccuracy;
         mAccuracy = l.mAccuracy;
         mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras);
+        mIsFromMockProvider = l.mIsFromMockProvider;
     }
 
     /**
@@ -160,6 +162,7 @@
         mHasAccuracy = false;
         mAccuracy = 0;
         mExtras = null;
+        mIsFromMockProvider = false;
     }
 
     /**
@@ -840,6 +843,7 @@
         if (mHasAltitude) s.append(" alt=").append(mAltitude);
         if (mHasSpeed) s.append(" vel=").append(mSpeed);
         if (mHasBearing) s.append(" bear=").append(mBearing);
+        if (mIsFromMockProvider) s.append(" mock");
 
         if (mExtras != null) {
             s.append(" {").append(mExtras).append('}');
@@ -871,6 +875,7 @@
             l.mHasAccuracy = in.readInt() != 0;
             l.mAccuracy = in.readFloat();
             l.mExtras = in.readBundle();
+            l.mIsFromMockProvider = in.readInt() != 0;
             return l;
         }
 
@@ -901,6 +906,7 @@
         parcel.writeInt(mHasAccuracy ? 1 : 0);
         parcel.writeFloat(mAccuracy);
         parcel.writeBundle(mExtras);
+        parcel.writeInt(mIsFromMockProvider? 1 : 0);
     }
 
     /**
@@ -934,4 +940,23 @@
         }
         mExtras.putParcelable(key, value);
     }
+
+    /**
+     * Returns true if the Location came from a mock provider.
+     *
+     * @return true if this Location came from a mock provider, false otherwise
+     */
+    public boolean isFromMockProvider() {
+        return mIsFromMockProvider;
+    }
+
+    /**
+     * Flag this Location as having come from a mock provider or not.
+     *
+     * @param isFromMockProvider true if this Location came from a mock provider, false otherwise
+     * @hide
+     */
+    public void setIsFromMockProvider(boolean isFromMockProvider) {
+        mIsFromMockProvider = isFromMockProvider;
+    }
 }
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 0b9286e..989178a 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -1549,9 +1549,9 @@
     public GpsStatus getGpsStatus(GpsStatus status) {
         if (status == null) {
             status = new GpsStatus();
-       }
-       status.setStatus(mGpsStatus);
-       return status;
+        }
+        status.setStatus(mGpsStatus);
+        return status;
     }
 
     /**
diff --git a/media/java/android/mtp/MtpStorage.java b/media/java/android/mtp/MtpStorage.java
index 9cf65a3..e20eabc 100644
--- a/media/java/android/mtp/MtpStorage.java
+++ b/media/java/android/mtp/MtpStorage.java
@@ -39,7 +39,7 @@
         mStorageId = volume.getStorageId();
         mPath = volume.getPath();
         mDescription = context.getResources().getString(volume.getDescriptionId());
-        mReserveSpace = volume.getMtpReserveSpace() * 1024 * 1024;
+        mReserveSpace = volume.getMtpReserveSpace() * 1024L * 1024L;
         mRemovable = volume.isRemovable();
         mMaxFileSize = volume.getMaxFileSize();
     }
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 14fe6af..b85121e 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -49,7 +49,8 @@
     <uses-permission android:name="android.permission.SET_SCREEN_COMPATIBILITY" />
     <uses-permission android:name="android.permission.START_ANY_ACTIVITY" />
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
-
+    <uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
+    
     <!-- WindowManager -->
     <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
diff --git a/packages/SystemUI/res/layout-ldrtl/navigation_bar.xml b/packages/SystemUI/res/layout-ldrtl/navigation_bar.xml
new file mode 100644
index 0000000..03ca729
--- /dev/null
+++ b/packages/SystemUI/res/layout-ldrtl/navigation_bar.xml
@@ -0,0 +1,322 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* apps/common/assets/default/default/skins/StatusBar.xml
+**
+** Copyright 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.
+*/
+-->
+
+<com.android.systemui.statusbar.phone.NavigationBarView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent"
+    android:background="#FF000000"
+    >
+
+    <FrameLayout android:id="@+id/rot0"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        >
+
+        <LinearLayout
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:orientation="horizontal"
+            android:clipChildren="false"
+            android:clipToPadding="false"
+            android:id="@+id/nav_buttons"
+            android:animateLayoutChanges="true"
+            >
+
+            <!-- navigation controls -->
+            <View
+                android:layout_width="40dp"
+                android:layout_height="match_parent"
+                android:layout_weight="0"
+                android:visibility="invisible"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
+                android:layout_width="@dimen/navigation_key_width"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_back"
+                systemui:keyCode="4"
+                android:layout_weight="0"
+                android:scaleType="center"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight"
+                android:contentDescription="@string/accessibility_back"
+                />
+            <View 
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"
+                android:layout_width="@dimen/navigation_key_width"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_home"
+                systemui:keyCode="3"
+                systemui:keyRepeat="false"
+                android:layout_weight="0"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight"
+                android:contentDescription="@string/accessibility_home"
+                />
+            <View 
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"
+                android:layout_width="@dimen/navigation_key_width"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_recent"
+                android:layout_weight="0"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight"
+                android:contentDescription="@string/accessibility_recent"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
+                android:layout_width="@dimen/navigation_menu_key_width"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_menu"
+                systemui:keyCode="82"
+                android:layout_weight="0"
+                android:visibility="invisible"
+                android:contentDescription="@string/accessibility_menu"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight"
+                />
+        </LinearLayout>
+
+        <!-- lights out layout to match exactly -->
+        <LinearLayout
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:orientation="horizontal"
+            android:id="@+id/lights_out"
+            android:visibility="gone"
+            >
+            <ImageView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:layout_marginStart="40dp"
+                android:src="@drawable/ic_sysbar_lights_out_dot_small"
+                android:scaleType="center"
+                android:layout_weight="0"
+                />
+            <View 
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <ImageView
+                android:layout_width="80dp"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_lights_out_dot_large"
+                android:scaleType="center"
+                android:layout_weight="0"
+                />
+            <View 
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <ImageView
+                android:layout_width="80dp"
+                android:layout_marginEnd="40dp"
+                android:layout_height="match_parent"
+                android:src="@drawable/ic_sysbar_lights_out_dot_small"
+                android:scaleType="center"
+                android:layout_weight="0"
+                />
+        </LinearLayout>
+
+        <com.android.systemui.statusbar.policy.KeyButtonView
+            android:layout_width="80dp"
+            android:id="@+id/search_light"
+            android:layout_height="match_parent"
+            android:layout_gravity="center_horizontal"
+            android:src="@drawable/search_light"
+            android:scaleType="center"
+            android:visibility="gone"
+            />
+
+        <com.android.systemui.statusbar.policy.DeadZone
+            android:id="@+id/deadzone"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            systemui:minSize="@dimen/navigation_bar_deadzone_size"
+            systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
+            systemui:holdTime="@integer/navigation_bar_deadzone_hold"
+            systemui:decayTime="@integer/navigation_bar_deadzone_decay"
+            systemui:orientation="horizontal"
+            android:layout_gravity="top"
+            />
+    </FrameLayout>
+
+    <FrameLayout android:id="@+id/rot90"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:visibility="gone"
+        android:paddingTop="0dp"
+        >
+
+        <LinearLayout 
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:orientation="vertical"
+            android:clipChildren="false"
+            android:clipToPadding="false"
+            android:id="@+id/nav_buttons"
+            android:animateLayoutChanges="true"
+            >
+            
+            <!-- navigation controls -->
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
+                android:layout_height="40dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_menu_land"
+                systemui:keyCode="82"
+                android:layout_weight="0"
+                android:visibility="invisible"
+                android:contentDescription="@string/accessibility_menu"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
+                android:layout_height="80dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_back_land"
+                android:scaleType="center"
+                systemui:keyCode="4"
+                android:layout_weight="0"
+                android:contentDescription="@string/accessibility_back"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
+                />
+            <View
+                android:layout_height="match_parent"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"
+                android:layout_height="80dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_home_land"
+                systemui:keyCode="3"
+                systemui:keyRepeat="false"
+                android:layout_weight="0"
+                android:contentDescription="@string/accessibility_home"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
+                />
+            <View 
+                android:layout_height="match_parent"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"
+                android:layout_height="80dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_recent_land"
+                android:layout_weight="0"
+                android:contentDescription="@string/accessibility_recent"
+                systemui:glowBackground="@drawable/ic_sysbar_highlight_land"
+                />
+            <View
+                android:layout_height="40dp"
+                android:layout_width="match_parent"
+                android:layout_weight="0"
+                android:visibility="invisible"
+                />
+        </LinearLayout>
+
+        <!-- lights out layout to match exactly -->
+        <LinearLayout 
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:orientation="vertical"
+            android:id="@+id/lights_out"
+            android:visibility="gone"
+            >
+            <ImageView
+                android:layout_height="80dp"
+                android:layout_marginTop="40dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_lights_out_dot_small"
+                android:scaleType="center"
+                android:layout_weight="0"
+                />
+            <View 
+                android:layout_height="match_parent"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <ImageView
+                android:layout_height="80dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_lights_out_dot_large"
+                android:scaleType="center"
+                android:layout_weight="0"
+                />
+            <View 
+                android:layout_height="match_parent"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:visibility="invisible"
+                />
+            <ImageView
+                android:layout_height="80dp"
+                android:layout_marginBottom="40dp"
+                android:layout_width="match_parent"
+                android:src="@drawable/ic_sysbar_lights_out_dot_small"
+                android:scaleType="center"
+                android:layout_weight="0"
+                />
+        </LinearLayout>
+
+        <com.android.systemui.statusbar.policy.KeyButtonView
+            android:id="@+id/search_light"
+            android:layout_height="80dp"
+            android:layout_width="match_parent"
+            android:layout_gravity="center_vertical"
+            android:src="@drawable/search_light"
+            android:scaleType="center"
+            android:visibility="gone"
+            />
+
+        <com.android.systemui.statusbar.policy.DeadZone
+            android:id="@+id/deadzone"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            systemui:minSize="@dimen/navigation_bar_deadzone_size"
+            systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
+            systemui:holdTime="@integer/navigation_bar_deadzone_hold"
+            systemui:decayTime="@integer/navigation_bar_deadzone_decay"
+            systemui:orientation="vertical"
+            android:layout_gravity="top"
+            />
+    </FrameLayout>
+
+    <!-- not used -->
+    <View android:id="@+id/rot270"
+        android:layout_height="match_parent"
+        android:layout_width="match_parent"
+        android:visibility="gone"
+        />
+
+</com.android.systemui.statusbar.phone.NavigationBarView>
diff --git a/packages/SystemUI/res/layout/status_bar_recent_item.xml b/packages/SystemUI/res/layout/status_bar_recent_item.xml
index 7ce3a09..6290bb3 100644
--- a/packages/SystemUI/res/layout/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout/status_bar_recent_item.xml
@@ -48,6 +48,7 @@
             android:ellipsize="marquee"
             android:textColor="@color/status_bar_recents_app_label_color"
             android:importantForAccessibility="no"
+            android:textAlignment="viewStart"
         />
         <FrameLayout android:id="@+id/app_thumbnail"
             android:layout_width="wrap_content"
@@ -101,6 +102,7 @@
             android:layout_marginTop="3dip"
             android:singleLine="true"
             android:ellipsize="marquee"
+            android:textAlignment="viewStart"
         />
 
     </RelativeLayout>
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index a1c5650..79f9650 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -564,7 +564,7 @@
     
             return program;
         }
-        
+
         private int buildShader(String source, int type) {
             int shader = glCreateShader(type);
     
@@ -585,27 +585,28 @@
             
             return shader;
         }
-    
+
         private void checkEglError() {
             int error = mEgl.eglGetError();
             if (error != EGL_SUCCESS) {
                 Log.w(GL_LOG_TAG, "EGL error = " + GLUtils.getEGLErrorString(error));
             }
         }
-    
+
         private void checkGlError() {
             int error = glGetError();
             if (error != GL_NO_ERROR) {
                 Log.w(GL_LOG_TAG, "GL error = 0x" + Integer.toHexString(error), new Throwable());
             }
         }
-    
+
         private void finishGL() {
             mEgl.eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
             mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
             mEgl.eglDestroyContext(mEglDisplay, mEglContext);
+            mEgl.eglTerminate(mEglDisplay);
         }
-        
+
         private boolean initGL(SurfaceHolder surfaceHolder) {
             mEgl = (EGL10) EGLContext.getEGL();
     
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
index c0a6f56..1f29990 100644
--- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
@@ -103,7 +103,7 @@
         } else {
             // Otherwise, keyguard isn't showing so launch it from here.
             Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+                    .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
             if (intent == null) return;
 
             try {
@@ -180,7 +180,7 @@
 
     private void maybeSwapSearchIcon() {
         Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+                .getAssistIntent(mContext, false, UserHandle.USER_CURRENT);
         if (intent != null) {
             ComponentName component = intent.getComponent();
             if (component == null || !mGlowPadView.replaceTargetDrawablesIfPresent(component,
@@ -329,6 +329,6 @@
 
     public boolean isAssistantAvailable() {
         return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
+                .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 17b0b50..280b368 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -72,6 +72,13 @@
     Runnable finisher;
     int iconSize;
     int result;
+
+    void clearImage() {
+        context = null;
+        image = null;
+        imageUri = null;
+        iconSize = 0;
+    }
 }
 
 /**
@@ -165,6 +172,10 @@
     @Override
     protected SaveImageInBackgroundData doInBackground(SaveImageInBackgroundData... params) {
         if (params.length != 1) return null;
+        if (isCancelled()) {
+            params[0].clearImage();
+            return null;
+        }
 
         // By default, AsyncTask sets the worker thread to have background thread priority, so bump
         // it back up so that we save a little quicker.
@@ -225,8 +236,7 @@
         } catch (Exception e) {
             // IOException/UnsupportedOperationException may be thrown if external storage is not
             // mounted
-            params[0].imageUri = null;
-            params[0].image = null;
+            params[0].clearImage();
             params[0].result = 1;
         }
 
@@ -240,6 +250,12 @@
 
     @Override
     protected void onPostExecute(SaveImageInBackgroundData params) {
+        if (isCancelled()) {
+            params.finisher.run();
+            params.clearImage();
+            return;
+        }
+
         if (params.result > 0) {
             // Show a message that we've failed to save the image to disk
             GlobalScreenshot.notifyScreenshotError(params.context, mNotificationManager);
@@ -308,6 +324,8 @@
     private float mBgPadding;
     private float mBgPaddingScale;
 
+    private AsyncTask<SaveImageInBackgroundData, Void, SaveImageInBackgroundData> mSaveInBgTask;
+
     private MediaActionSound mCameraSound;
 
 
@@ -374,7 +392,10 @@
         data.image = mScreenBitmap;
         data.iconSize = mNotificationIconSize;
         data.finisher = finisher;
-        new SaveImageInBackgroundTask(mContext, data, mNotificationManager,
+        if (mSaveInBgTask != null) {
+            mSaveInBgTask.cancel(false);
+        }
+        mSaveInBgTask = new SaveImageInBackgroundTask(mContext, data, mNotificationManager,
                 SCREENSHOT_NOTIFICATION_ID).execute(data);
     }
 
@@ -455,6 +476,7 @@
         // Setup the animation with the screenshot just taken
         if (mScreenshotAnimation != null) {
             mScreenshotAnimation.end();
+            mScreenshotAnimation.removeAllListeners();
         }
 
         mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b5cbdd1..d1fb2b0 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -179,8 +179,7 @@
     // These need to match the documentation/constant in
     // core/res/res/values/config.xml
     static final int LONG_PRESS_HOME_NOTHING = 0;
-    static final int LONG_PRESS_HOME_RECENT_DIALOG = 1;
-    static final int LONG_PRESS_HOME_RECENT_SYSTEM_UI = 2;
+    static final int LONG_PRESS_HOME_RECENT_SYSTEM_UI = 1;
 
     static final int APPLICATION_MEDIA_SUBLAYER = -2;
     static final int APPLICATION_MEDIA_OVERLAY_SUBLAYER = -1;
@@ -782,11 +781,6 @@
             // Eat the longpress so it won't dismiss the recent apps dialog when
             // the user lets go of the home key
             mHomeLongPressed = true;
-        }
-
-        if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {
-            showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
-        } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
             try {
                 IStatusBarService statusbar = getStatusBarService();
                 if (statusbar != null) {
@@ -1842,7 +1836,7 @@
                 mHomePressed = false;
                 mHomeLongPressed = false;
                 if (!homeWasLongPressed) {
-                    if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
+                    if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {
                         try {
                             IStatusBarService statusbar = getStatusBarService();
                             if (statusbar != null) {
@@ -1964,8 +1958,21 @@
             }
             return 0;
         } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {
-            if (down && repeatCount == 0 && !keyguardOn) {
-                showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
+            if (!keyguardOn) {
+                try {
+                    IStatusBarService statusbar = getStatusBarService();
+                    if (statusbar != null) {
+                        if (down && repeatCount == 0) {
+                            statusbar.preloadRecentApps();
+                        } else if (!down) {
+                            statusbar.toggleRecentApps();
+                        }
+                    }
+                } catch (RemoteException e) {
+                    Slog.e(TAG, "RemoteException when preloading recent apps", e);
+                    // re-acquire status bar service next time it is needed.
+                    mStatusBarService = null;
+                }
             }
             return -1;
         } else if (keyCode == KeyEvent.KEYCODE_ASSIST) {
@@ -2206,7 +2213,7 @@
     private void launchAssistAction() {
         sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST);
         Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+                .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
         if (intent != null) {
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                     | Intent.FLAG_ACTIVITY_SINGLE_TOP
@@ -4134,6 +4141,11 @@
         return rotation == mPortraitRotation || rotation == mUpsideDownRotation;
     }
 
+    public int getUserRotationMode() {
+        return Settings.System.getIntForUser(mContext.getContentResolver(),
+                Settings.System.USER_ROTATION, WindowManagerPolicy.USER_ROTATION_FREE,
+                UserHandle.USER_CURRENT);
+    }
 
     // User rotation: to be used when all else fails in assigning an orientation to the device
     public void setUserRotationMode(int mode, int rot) {
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
index 217e5d7..27d808b 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -1567,7 +1567,7 @@
 
     public void showAssistant() {
         final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-          .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+          .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
 
         if (intent == null) return;
 
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
index 76cbbd5..6859042 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java
@@ -61,7 +61,7 @@
                 case com.android.internal.R.drawable.ic_action_assist_generic:
                     Intent assistIntent =
                             ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                            .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+                            .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
                     if (assistIntent != null) {
                         mActivityLauncher.launchActivity(assistIntent, false, true, null, null);
                     } else {
@@ -195,7 +195,7 @@
                 currentUserHandle);
         boolean searchActionAvailable =
                 ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                .getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
+                .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
         mCameraDisabled = cameraDisabledByAdmin || disabledBySimState || !cameraTargetPresent
                 || !currentUserSetup;
         mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent
@@ -207,7 +207,7 @@
         // Update the search icon with drawable from the search .apk
         if (!mSearchDisabled) {
             Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
-                    .getAssistIntent(mContext, UserHandle.USER_CURRENT);
+                    .getAssistIntent(mContext, false, UserHandle.USER_CURRENT);
             if (intent != null) {
                 // XXX Hack. We need to substitute the icon here but haven't formalized
                 // the public API. The "_google" metadata will be going away, so
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
index fef0613..8e10528 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
@@ -1428,6 +1428,6 @@
 
     private boolean isAssistantAvailable() {
         return mSearchManager != null
-                && mSearchManager.getAssistIntent(mContext, UserHandle.USER_CURRENT) != null;
+                && mSearchManager.getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
     }
 }
diff --git a/services/java/com/android/server/AppOpsService.java b/services/java/com/android/server/AppOpsService.java
index 1712806..bf2a5ae 100644
--- a/services/java/com/android/server/AppOpsService.java
+++ b/services/java/com/android/server/AppOpsService.java
@@ -38,6 +38,7 @@
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.util.AtomicFile;
+import android.util.Log;
 import android.util.Slog;
 import android.util.SparseArray;
 import android.util.TimeUtils;
@@ -93,12 +94,15 @@
 
     final static class Op {
         public final int op;
+        public int mode;
         public int duration;
         public long time;
+        public long rejectTime;
         public int nesting;
 
         public Op(int _op) {
             op = _op;
+            mode = AppOpsManager.MODE_ALLOWED;
         }
     }
 
@@ -127,6 +131,30 @@
         }
     }
 
+    private ArrayList<AppOpsManager.OpEntry> collectOps(Ops pkgOps, int[] ops) {
+        ArrayList<AppOpsManager.OpEntry> resOps = null;
+        if (ops == null) {
+            resOps = new ArrayList<AppOpsManager.OpEntry>();
+            for (int j=0; j<pkgOps.size(); j++) {
+                Op curOp = pkgOps.valueAt(j);
+                resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time,
+                        curOp.rejectTime, curOp.duration));
+            }
+        } else {
+            for (int j=0; j<ops.length; j++) {
+                Op curOp = pkgOps.get(ops[j]);
+                if (curOp != null) {
+                    if (resOps == null) {
+                        resOps = new ArrayList<AppOpsManager.OpEntry>();
+                    }
+                    resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time,
+                            curOp.rejectTime, curOp.duration));
+                }
+            }
+        }
+        return resOps;
+    }
+
     @Override
     public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
         mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
@@ -136,26 +164,7 @@
             for (int i=0; i<mUidOps.size(); i++) {
                 HashMap<String, Ops> packages = mUidOps.valueAt(i);
                 for (Ops pkgOps : packages.values()) {
-                    ArrayList<AppOpsManager.OpEntry> resOps = null;
-                    if (ops == null) {
-                        resOps = new ArrayList<AppOpsManager.OpEntry>();
-                        for (int j=0; j<pkgOps.size(); j++) {
-                            Op curOp = pkgOps.valueAt(j);
-                            resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.time,
-                                    curOp.duration));
-                        }
-                    } else {
-                        for (int j=0; j<ops.length; j++) {
-                            Op curOp = pkgOps.get(ops[j]);
-                            if (curOp != null) {
-                                if (resOps == null) {
-                                    resOps = new ArrayList<AppOpsManager.OpEntry>();
-                                }
-                                resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.time,
-                                        curOp.duration));
-                            }
-                        }
-                    }
+                    ArrayList<AppOpsManager.OpEntry> resOps = collectOps(pkgOps, ops);
                     if (resOps != null) {
                         if (res == null) {
                             res = new ArrayList<AppOpsManager.PackageOps>();
@@ -171,6 +180,42 @@
     }
 
     @Override
+    public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName,
+            int[] ops) {
+        mContext.enforcePermission(android.Manifest.permission.GET_APP_OPS_STATS,
+                Binder.getCallingPid(), Binder.getCallingUid(), null);
+        synchronized (this) {
+            Ops pkgOps = getOpsLocked(uid, packageName, false);
+            if (pkgOps == null) {
+                return null;
+            }
+            ArrayList<AppOpsManager.OpEntry> resOps = collectOps(pkgOps, ops);
+            if (resOps == null) {
+                return null;
+            }
+            ArrayList<AppOpsManager.PackageOps> res = new ArrayList<AppOpsManager.PackageOps>();
+            AppOpsManager.PackageOps resPackage = new AppOpsManager.PackageOps(
+                    pkgOps.packageName, pkgOps.uid, resOps);
+            res.add(resPackage);
+            return res;
+        }
+    }
+
+    @Override
+    public void setMode(int code, int uid, String packageName, int mode) {
+        uid = handleIncomingUid(uid);
+        synchronized (this) {
+            Op op = getOpLocked(code, uid, packageName, true);
+            if (op != null) {
+                if (op.mode != mode) {
+                    op.mode = mode;
+                    scheduleWriteNowLocked();
+                }
+            }
+        }
+    }
+
+    @Override
     public int checkOperation(int code, int uid, String packageName) {
         uid = handleIncomingUid(uid);
         synchronized (this) {
@@ -178,8 +223,8 @@
             if (op == null) {
                 return AppOpsManager.MODE_ALLOWED;
             }
+            return op.mode;
         }
-        return AppOpsManager.MODE_ALLOWED;
     }
 
     @Override
@@ -188,16 +233,26 @@
         synchronized (this) {
             Op op = getOpLocked(code, uid, packageName, true);
             if (op == null) {
+                if (DEBUG) Log.d(TAG, "noteOperation: no op for code " + code + " uid " + uid
+                        + " package " + packageName);
                 return AppOpsManager.MODE_IGNORED;
             }
             if (op.duration == -1) {
                 Slog.w(TAG, "Noting op not finished: uid " + uid + " pkg " + packageName
                         + " code " + code + " time=" + op.time + " duration=" + op.duration);
             }
-            op.time = System.currentTimeMillis();
             op.duration = 0;
+            if (op.mode != AppOpsManager.MODE_ALLOWED) {
+                if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + code
+                        + " uid " + uid + " package " + packageName);
+                op.rejectTime = System.currentTimeMillis();
+                return op.mode;
+            }
+            if (DEBUG) Log.d(TAG, "noteOperation: allowing code " + code + " uid " + uid
+                    + " package " + packageName);
+            op.time = System.currentTimeMillis();
+            return AppOpsManager.MODE_ALLOWED;
         }
-        return AppOpsManager.MODE_ALLOWED;
     }
 
     @Override
@@ -206,15 +261,25 @@
         synchronized (this) {
             Op op = getOpLocked(code, uid, packageName, true);
             if (op == null) {
+                if (DEBUG) Log.d(TAG, "startOperation: no op for code " + code + " uid " + uid
+                        + " package " + packageName);
                 return AppOpsManager.MODE_IGNORED;
             }
+            if (op.mode != AppOpsManager.MODE_ALLOWED) {
+                if (DEBUG) Log.d(TAG, "startOperation: reject #" + op.mode + " for code " + code
+                        + " uid " + uid + " package " + packageName);
+                op.rejectTime = System.currentTimeMillis();
+                return op.mode;
+            }
+            if (DEBUG) Log.d(TAG, "startOperation: allowing code " + code + " uid " + uid
+                    + " package " + packageName);
             if (op.nesting == 0) {
                 op.time = System.currentTimeMillis();
                 op.duration = -1;
             }
             op.nesting++;
+            return AppOpsManager.MODE_ALLOWED;
         }
-        return AppOpsManager.MODE_ALLOWED;
     }
 
     @Override
@@ -252,7 +317,7 @@
         return uid;
     }
 
-    private Op getOpLocked(int code, int uid, String packageName, boolean edit) {
+    private Ops getOpsLocked(int uid, String packageName, boolean edit) {
         HashMap<String, Ops> pkgOps = mUidOps.get(uid);
         if (pkgOps == null) {
             if (!edit) {
@@ -289,6 +354,29 @@
             ops = new Ops(packageName, uid);
             pkgOps.put(packageName, ops);
         }
+        return ops;
+    }
+
+    private void scheduleWriteLocked() {
+        if (!mWriteScheduled) {
+            mWriteScheduled = true;
+            mHandler.postDelayed(mWriteRunner, WRITE_DELAY);
+        }
+    }
+
+    private void scheduleWriteNowLocked() {
+        if (!mWriteScheduled) {
+            mWriteScheduled = true;
+        }
+        mHandler.removeCallbacks(mWriteRunner);
+        mHandler.post(mWriteRunner);
+    }
+
+    private Op getOpLocked(int code, int uid, String packageName, boolean edit) {
+        Ops ops = getOpsLocked(uid, packageName, edit);
+        if (ops == null) {
+            return null;
+        }
         Op op = ops.get(code);
         if (op == null) {
             if (!edit) {
@@ -297,9 +385,8 @@
             op = new Op(code);
             ops.put(code, op);
         }
-        if (edit && !mWriteScheduled) {
-            mWriteScheduled = true;
-            mHandler.postDelayed(mWriteRunner, WRITE_DELAY);
+        if (edit) {
+            scheduleWriteLocked();
         }
         return op;
     }
@@ -406,8 +493,22 @@
             String tagName = parser.getName();
             if (tagName.equals("op")) {
                 Op op = new Op(Integer.parseInt(parser.getAttributeValue(null, "n")));
-                op.time = Long.parseLong(parser.getAttributeValue(null, "t"));
-                op.duration = Integer.parseInt(parser.getAttributeValue(null, "d"));
+                String mode = parser.getAttributeValue(null, "m");
+                if (mode != null) {
+                    op.mode = Integer.parseInt(mode);
+                }
+                String time = parser.getAttributeValue(null, "t");
+                if (time != null) {
+                    op.time = Long.parseLong(time);
+                }
+                time = parser.getAttributeValue(null, "r");
+                if (time != null) {
+                    op.rejectTime = Long.parseLong(time);
+                }
+                String dur = parser.getAttributeValue(null, "d");
+                if (dur != null) {
+                    op.duration = Integer.parseInt(dur);
+                }
                 HashMap<String, Ops> pkgOps = mUidOps.get(uid);
                 if (pkgOps == null) {
                     pkgOps = new HashMap<String, Ops>();
@@ -464,8 +565,21 @@
                             AppOpsManager.OpEntry op = ops.get(j);
                             out.startTag(null, "op");
                             out.attribute(null, "n", Integer.toString(op.getOp()));
-                            out.attribute(null, "t", Long.toString(op.getTime()));
-                            out.attribute(null, "d", Integer.toString(op.getDuration()));
+                            if (op.getMode() != AppOpsManager.MODE_ALLOWED) {
+                                out.attribute(null, "m", Integer.toString(op.getMode()));
+                            }
+                            long time = op.getTime();
+                            if (time != 0) {
+                                out.attribute(null, "t", Long.toString(time));
+                            }
+                            time = op.getRejectTime();
+                            if (time != 0) {
+                                out.attribute(null, "r", Long.toString(time));
+                            }
+                            int dur = op.getDuration();
+                            if (dur != 0) {
+                                out.attribute(null, "d", Integer.toString(dur));
+                            }
                             out.endTag(null, "op");
                         }
                         out.endTag(null, "uid");
@@ -497,6 +611,7 @@
 
         synchronized (this) {
             pw.println("Current AppOps Service state:");
+            final long now = System.currentTimeMillis();
             for (int i=0; i<mUidOps.size(); i++) {
                 pw.print("  Uid "); UserHandle.formatUid(pw, mUidOps.keyAt(i)); pw.println(":");
                 HashMap<String, Ops> pkgOps = mUidOps.valueAt(i);
@@ -504,10 +619,16 @@
                     pw.print("    Package "); pw.print(ops.packageName); pw.println(":");
                     for (int j=0; j<ops.size(); j++) {
                         Op op = ops.valueAt(j);
-                        pw.print("      "); pw.print(AppOpsManager.opToString(op.op));
-                        pw.print(": time=");
-                        TimeUtils.formatDuration(System.currentTimeMillis()-op.time, pw);
-                        pw.print(" ago");
+                        pw.print("      "); pw.print(AppOpsManager.opToName(op.op));
+                        pw.print(": mode="); pw.print(op.mode);
+                        if (op.time != 0) {
+                            pw.print("; time="); TimeUtils.formatDuration(now-op.time, pw);
+                            pw.print(" ago");
+                        }
+                        if (op.rejectTime != 0) {
+                            pw.print("; rejectTime="); TimeUtils.formatDuration(now-op.rejectTime, pw);
+                            pw.print(" ago");
+                        }
                         if (op.duration == -1) {
                             pw.println(" (running)");
                         } else {
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 593b9bf..1a8641b 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -382,6 +382,8 @@
     private boolean mInputBoundToKeyguard;
 
     class SettingsObserver extends ContentObserver {
+        String mLastEnabled = "";
+
         SettingsObserver(Handler handler) {
             super(handler);
             ContentResolver resolver = mContext.getContentResolver();
@@ -395,7 +397,13 @@
 
         @Override public void onChange(boolean selfChange) {
             synchronized (mMethodMap) {
-                updateFromSettingsLocked();
+                boolean enabledChanged = false;
+                String newEnabled = mSettings.getEnabledInputMethodsStr();
+                if (!mLastEnabled.equals(newEnabled)) {
+                    mLastEnabled = newEnabled;
+                    enabledChanged = true;
+                }
+                updateFromSettingsLocked(enabledChanged);
             }
         }
     }
@@ -503,7 +511,8 @@
                     }
                 }
 
-                buildInputMethodListLocked(mMethodList, mMethodMap);
+                buildInputMethodListLocked(
+                        mMethodList, mMethodMap, false /* resetDefaultEnabledIme */);
 
                 boolean changed = false;
 
@@ -539,7 +548,7 @@
                 }
 
                 if (changed) {
-                    updateFromSettingsLocked();
+                    updateFromSettingsLocked(false);
                 }
             }
         }
@@ -663,9 +672,13 @@
 
         // Just checking if defaultImiId is empty or not
         final String defaultImiId = mSettings.getSelectedInputMethod();
+        if (DEBUG) {
+            Slog.d(TAG, "Initial default ime = " + defaultImiId);
+        }
         mImeSelectedOnBoot = !TextUtils.isEmpty(defaultImiId);
 
-        buildInputMethodListLocked(mMethodList, mMethodMap);
+        buildInputMethodListLocked(mMethodList, mMethodMap,
+                !mImeSelectedOnBoot /* resetDefaultEnabledIme */);
         mSettings.enableAllIMEsIfThereIsNoEnabledIME();
 
         if (!mImeSelectedOnBoot) {
@@ -674,7 +687,7 @@
         }
 
         mSettingsObserver = new SettingsObserver(mHandler);
-        updateFromSettingsLocked();
+        updateFromSettingsLocked(true);
 
         // IMMS wants to receive Intent.ACTION_LOCALE_CHANGED in order to update the current IME
         // according to the new system locale.
@@ -718,7 +731,7 @@
         }
     }
 
-    private void resetAllInternalStateLocked(boolean updateOnlyWhenLocaleChanged) {
+    private void resetAllInternalStateLocked(final boolean updateOnlyWhenLocaleChanged) {
         if (!mSystemReady) {
             // not system ready
             return;
@@ -736,7 +749,8 @@
             }
             // InputMethodAndSubtypeListManager should be reset when the locale is changed.
             mImListManager = new InputMethodAndSubtypeListManager(mContext, this);
-            buildInputMethodListLocked(mMethodList, mMethodMap);
+            buildInputMethodListLocked(mMethodList, mMethodMap,
+                    updateOnlyWhenLocaleChanged /* resetDefaultEnabledIme */);
             if (!updateOnlyWhenLocaleChanged) {
                 final String selectedImiId = mSettings.getSelectedInputMethod();
                 if (TextUtils.isEmpty(selectedImiId)) {
@@ -748,7 +762,7 @@
                 // If the locale is changed, needs to reset the default ime
                 resetDefaultImeLocked(mContext);
             }
-            updateFromSettingsLocked();
+            updateFromSettingsLocked(true);
             mLastSystemLocale = newLocale;
             if (!updateOnlyWhenLocaleChanged) {
                 try {
@@ -806,7 +820,8 @@
                     mWindowManagerService.setOnHardKeyboardStatusChangeListener(
                             mHardKeyboardListener);
                 }
-                buildInputMethodListLocked(mMethodList, mMethodMap);
+                buildInputMethodListLocked(mMethodList, mMethodMap,
+                        !mImeSelectedOnBoot /* resetDefaultEnabledIme */);
                 if (!mImeSelectedOnBoot) {
                     Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here.");
                     checkCurrentLocaleChangedLocked();
@@ -1533,7 +1548,27 @@
         return false;
     }
 
-    void updateFromSettingsLocked() {
+    void updateFromSettingsLocked(boolean enabledMayChange) {
+        if (enabledMayChange) {
+            List<InputMethodInfo> enabled = mSettings.getEnabledInputMethodListLocked();
+            for (int i=0; i<enabled.size(); i++) {
+                // We allow the user to select "disabled until used" apps, so if they
+                // are enabling one of those here we now need to make it enabled.
+                InputMethodInfo imm = enabled.get(i);
+                try {
+                    ApplicationInfo ai = mIPackageManager.getApplicationInfo(imm.getPackageName(),
+                            PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS,
+                            mSettings.getCurrentUserId());
+                    if (ai.enabledSetting
+                            == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+                        mIPackageManager.setApplicationEnabledSetting(imm.getPackageName(),
+                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                                PackageManager.DONT_KILL_APP, mSettings.getCurrentUserId());
+                    }
+                } catch (RemoteException e) {
+                }
+            }
+        }
         // We are assuming that whoever is changing DEFAULT_INPUT_METHOD and
         // ENABLED_INPUT_METHODS is taking care of keeping them correctly in
         // sync, so we will never have a DEFAULT_INPUT_METHOD that is not
@@ -2119,7 +2154,8 @@
                         mFileManager.addInputMethodSubtypes(imi, subtypes);
                         final long ident = Binder.clearCallingIdentity();
                         try {
-                            buildInputMethodListLocked(mMethodList, mMethodMap);
+                            buildInputMethodListLocked(mMethodList, mMethodMap,
+                                    false /* resetDefaultEnabledIme */);
                         } finally {
                             Binder.restoreCallingIdentity(ident);
                         }
@@ -2369,9 +2405,10 @@
     }
 
     void buildInputMethodListLocked(ArrayList<InputMethodInfo> list,
-            HashMap<String, InputMethodInfo> map) {
+            HashMap<String, InputMethodInfo> map, boolean resetDefaultEnabledIme) {
         if (DEBUG) {
-            Slog.d(TAG, "--- re-buildInputMethodList " + ", \n ------ \n" + getStackTrace());
+            Slog.d(TAG, "--- re-buildInputMethodList reset = " + resetDefaultEnabledIme
+                    + " \n ------ \n" + getStackTrace());
         }
         list.clear();
         map.clear();
@@ -2383,7 +2420,8 @@
 
         final List<ResolveInfo> services = pm.queryIntentServicesAsUser(
                 new Intent(InputMethod.SERVICE_INTERFACE),
-                PackageManager.GET_META_DATA, mSettings.getCurrentUserId());
+                PackageManager.GET_META_DATA | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS,
+                mSettings.getCurrentUserId());
 
         final HashMap<String, List<InputMethodSubtype>> additionalSubtypes =
                 mFileManager.getAllAdditionalInputMethodSubtypes();
@@ -2407,14 +2445,8 @@
                 final String id = p.getId();
                 map.put(id, p);
 
-                // Valid system default IMEs and IMEs that have English subtypes are enabled
-                // by default
-                if (InputMethodUtils.isDefaultEnabledIme(mSystemReady, p, mContext)) {
-                    setInputMethodEnabledLocked(id, true);
-                }
-
                 if (DEBUG) {
-                    Slog.d(TAG, "Found a third-party input method " + p);
+                    Slog.d(TAG, "Found an input method " + p);
                 }
 
             } catch (XmlPullParserException e) {
@@ -2424,12 +2456,24 @@
             }
         }
 
+        if (resetDefaultEnabledIme) {
+            final ArrayList<InputMethodInfo> defaultEnabledIme =
+                    InputMethodUtils.getDefaultEnabledImes(mContext, mSystemReady, list);
+            for (int i = 0; i < defaultEnabledIme.size(); ++i) {
+                final InputMethodInfo imi =  defaultEnabledIme.get(i);
+                if (DEBUG) {
+                    Slog.d(TAG, "--- enable ime = " + imi);
+                }
+                setInputMethodEnabledLocked(imi.getId(), true);
+            }
+        }
+
         final String defaultImiId = mSettings.getSelectedInputMethod();
         if (!TextUtils.isEmpty(defaultImiId)) {
             if (!map.containsKey(defaultImiId)) {
                 Slog.w(TAG, "Default IME is uninstalled. Choose new default IME.");
                 if (chooseNewDefaultIMELocked()) {
-                    updateFromSettingsLocked();
+                    updateFromSettingsLocked(true);
                 }
             } else {
                 // Double check that the default IME is certainly enabled.
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index b351fc2..9606cf1 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -529,9 +529,6 @@
         }
 
         public boolean callLocationChangedLocked(Location location) {
-            if (!reportLocationAccessNoThrow(mUid, mPackageName, mAllowedResolutionLevel)) {
-                return true;
-            }
             if (mListener != null) {
                 try {
                     synchronized (this) {
@@ -802,14 +799,20 @@
         }
     }
 
-    boolean reportLocationAccessNoThrow(int uid, String packageName, int allowedResolutionLevel) {
-        int op;
+    public static int resolutionLevelToOp(int allowedResolutionLevel) {
         if (allowedResolutionLevel != RESOLUTION_LEVEL_NONE) {
             if (allowedResolutionLevel == RESOLUTION_LEVEL_COARSE) {
-                op = AppOpsManager.OP_COARSE_LOCATION;
+                return AppOpsManager.OP_COARSE_LOCATION;
             } else {
-                op = AppOpsManager.OP_FINE_LOCATION;
+                return AppOpsManager.OP_FINE_LOCATION;
             }
+        }
+        return -1;
+    }
+
+    boolean reportLocationAccessNoThrow(int uid, String packageName, int allowedResolutionLevel) {
+        int op = resolutionLevelToOp(allowedResolutionLevel);
+        if (op >= 0) {
             if (mAppOps.noteOpNoThrow(op, uid, packageName) != AppOpsManager.MODE_ALLOWED) {
                 return false;
             }
@@ -818,13 +821,8 @@
     }
 
     boolean checkLocationAccess(int uid, String packageName, int allowedResolutionLevel) {
-        int op;
-        if (allowedResolutionLevel != RESOLUTION_LEVEL_NONE) {
-            if (allowedResolutionLevel == RESOLUTION_LEVEL_COARSE) {
-                op = AppOpsManager.OP_COARSE_LOCATION;
-            } else {
-                op = AppOpsManager.OP_FINE_LOCATION;
-            }
+        int op = resolutionLevelToOp(allowedResolutionLevel);
+        if (op >= 0) {
             if (mAppOps.checkOp(op, uid, packageName) != AppOpsManager.MODE_ALLOWED) {
                 return false;
             }
@@ -1019,11 +1017,14 @@
         if (records != null) {
             for (UpdateRecord record : records) {
                 if (UserHandle.getUserId(record.mReceiver.mUid) == mCurrentUserId) {
-                    LocationRequest locationRequest = record.mRequest;
-                    providerRequest.locationRequests.add(locationRequest);
-                    if (locationRequest.getInterval() < providerRequest.interval) {
-                        providerRequest.reportLocation = true;
-                        providerRequest.interval = locationRequest.getInterval();
+                    if (checkLocationAccess(record.mReceiver.mUid, record.mReceiver.mPackageName,
+                            record.mReceiver.mAllowedResolutionLevel)) {
+                        LocationRequest locationRequest = record.mRequest;
+                        providerRequest.locationRequests.add(locationRequest);
+                        if (locationRequest.getInterval() < providerRequest.interval) {
+                            providerRequest.reportLocation = true;
+                            providerRequest.interval = locationRequest.getInterval();
+                        }
                     }
                 }
             }
@@ -1144,9 +1145,6 @@
      * and consistency requirements.
      *
      * @param request the LocationRequest from which to create a sanitized version
-     * @param shouldBeCoarse whether the sanitized version should be held to coarse resolution
-     * constraints
-     * @param fastestCoarseIntervalMS minimum interval allowed for coarse resolution
      * @return a version of request that meets the given resolution and consistency requirements
      * @hide
      */
@@ -1340,16 +1338,18 @@
         final int uid = Binder.getCallingUid();
         final long identity = Binder.clearCallingIdentity();
         try {
-            if (!reportLocationAccessNoThrow(uid, packageName, allowedResolutionLevel)) {
-                return null;
-            }
-            
             if (mBlacklist.isBlacklisted(packageName)) {
                 if (D) Log.d(TAG, "not returning last loc for blacklisted app: " +
                         packageName);
                 return null;
             }
 
+            if (!reportLocationAccessNoThrow(uid, packageName, allowedResolutionLevel)) {
+                if (D) Log.d(TAG, "not returning last loc for no op app: " +
+                        packageName);
+                return null;
+            }
+
             synchronized (mLock) {
                 // Figure out the provider. Either its explicitly request (deprecated API's),
                 // or use the fused provider
@@ -1402,7 +1402,8 @@
         }
         long identity = Binder.clearCallingIdentity();
         try {
-            mGeofenceManager.addFence(sanitizedRequest, geofence, intent, uid, packageName);
+            mGeofenceManager.addFence(sanitizedRequest, geofence, intent, allowedResolutionLevel,
+                    uid, packageName);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -1703,6 +1704,13 @@
                 continue;
             }
 
+            if (!reportLocationAccessNoThrow(receiver.mUid, receiver.mPackageName,
+                    receiver.mAllowedResolutionLevel)) {
+                if (D) Log.d(TAG, "skipping loc update for no op app: " +
+                        receiver.mPackageName);
+                continue;
+            }
+
             Location notifyLocation = null;
             if (receiver.mAllowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
                 notifyLocation = coarseLocation;  // use coarse location
@@ -1784,17 +1792,33 @@
         }
     }
 
+    private boolean isMockProvider(String provider) {
+        synchronized (mLock) {
+            return mMockProviders.containsKey(provider);
+        }
+    }
+
     private void handleLocationChanged(Location location, boolean passive) {
-        String provider = location.getProvider();
+        // create a working copy of the incoming Location so that the service can modify it without
+        // disturbing the caller's copy
+        Location myLocation = new Location(location);
+        String provider = myLocation.getProvider();
+
+        // set "isFromMockProvider" bit if location came from a mock provider. we do not clear this
+        // bit if location did not come from a mock provider because passive/fused providers can
+        // forward locations from mock providers, and should not grant them legitimacy in doing so.
+        if (!myLocation.isFromMockProvider() && isMockProvider(provider)) {
+            myLocation.setIsFromMockProvider(true);
+        }
 
         if (!passive) {
             // notify passive provider of the new location
-            mPassiveProvider.updateLocation(location);
+            mPassiveProvider.updateLocation(myLocation);
         }
 
         synchronized (mLock) {
             if (isAllowedBySettingsLocked(provider, mCurrentUserId)) {
-                handleLocationChangedLocked(location, passive);
+                handleLocationChangedLocked(myLocation, passive);
             }
         }
     }
diff --git a/services/java/com/android/server/PreferredComponent.java b/services/java/com/android/server/PreferredComponent.java
index 718b05d..bb22545 100644
--- a/services/java/com/android/server/PreferredComponent.java
+++ b/services/java/com/android/server/PreferredComponent.java
@@ -164,17 +164,19 @@
         return mParseError;
     }
 
-    public void writeToXml(XmlSerializer serializer) throws IOException {
+    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
         final int NS = mSetClasses != null ? mSetClasses.length : 0;
         serializer.attribute(null, "name", mShortComponent);
-        if (mMatch != 0) {
-            serializer.attribute(null, "match", Integer.toHexString(mMatch));
-        }
-        serializer.attribute(null, "set", Integer.toString(NS));
-        for (int s=0; s<NS; s++) {
-            serializer.startTag(null, "set");
-            serializer.attribute(null, "name", mSetComponents[s]);
-            serializer.endTag(null, "set");
+        if (full) {
+            if (mMatch != 0) {
+                serializer.attribute(null, "match", Integer.toHexString(mMatch));
+            }
+            serializer.attribute(null, "set", Integer.toString(NS));
+            for (int s=0; s<NS; s++) {
+                serializer.startTag(null, "set");
+                serializer.attribute(null, "name", mSetComponents[s]);
+                serializer.endTag(null, "set");
+            }
         }
     }
 
diff --git a/services/java/com/android/server/RecognitionManagerService.java b/services/java/com/android/server/RecognitionManagerService.java
index 1e0755d..c2e749d 100644
--- a/services/java/com/android/server/RecognitionManagerService.java
+++ b/services/java/com/android/server/RecognitionManagerService.java
@@ -89,17 +89,15 @@
     private void initForUser(int userHandle) {
         if (DEBUG) Slog.i(TAG, "initForUser user=" + userHandle);
         ComponentName comp = getCurRecognizer(userHandle);
+        ServiceInfo info = null;
         if (comp != null) {
-            // See if the current recognizer is no longer available.
+            // See if the current recognizer is still available.
             try {
-                mIPm.getServiceInfo(comp, 0, userHandle);
+                info = mIPm.getServiceInfo(comp, 0, userHandle);
             } catch (RemoteException e) {
-                comp = findAvailRecognizer(null, userHandle);
-                if (comp != null) {
-                    setCurRecognizer(comp, userHandle);
-                }
             }
-        } else {
+        }
+        if (info == null) {
             comp = findAvailRecognizer(null, userHandle);
             if (comp != null) {
                 setCurRecognizer(comp, userHandle);
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 5789a53..ad6eb4d 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -18,6 +18,7 @@
 
 import android.app.ActivityManager;
 import android.app.AlarmManager;
+import android.app.AppOpsManager;
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
@@ -127,6 +128,7 @@
     private int mMulticastDisabled;
 
     private final IBatteryStats mBatteryStats;
+    private final AppOpsManager mAppOps;
 
     private boolean mEnableTrafficStatsPoll = false;
     private int mTrafficStatsPollToken = 0;
@@ -381,6 +383,7 @@
         mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName);
         mWifiStateMachine.enableRssiPolling(true);
         mBatteryStats = BatteryStatsService.getService();
+        mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
 
         mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
         Intent idleIntent = new Intent(ACTION_DEVICE_IDLE, null);
@@ -845,10 +848,15 @@
      * a list of {@link ScanResult} objects.
      * @return the list of results
      */
-    public List<ScanResult> getScanResults() {
+    public List<ScanResult> getScanResults(String callingPackage) {
         enforceAccessPermission();
         int userId = UserHandle.getCallingUserId();
+        int uid = Binder.getCallingUid();
         long ident = Binder.clearCallingIdentity();
+        if (mAppOps.noteOp(AppOpsManager.OP_WIFI_SCAN, uid, callingPackage)
+                != AppOpsManager.MODE_ALLOWED) {
+            return new ArrayList<ScanResult>();
+        }
         try {
             int currentUser = ActivityManager.getCurrentUser();
             if (userId != currentUser) {
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 0725df0..b7c3450 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -17,7 +17,6 @@
 package com.android.server.accessibility;
 
 import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT;
-import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
 
 import android.Manifest;
 import android.accessibilityservice.AccessibilityService;
@@ -518,6 +517,10 @@
         ComponentName componentName = new ComponentName("foo.bar",
                 "AutomationAccessibilityService");
         synchronized (mLock) {
+            if (mUiAutomationService != null) {
+                throw new IllegalStateException("UiAutomationService " + serviceClient
+                        + "already registered!");
+            }
             // If an automation services is connected to the system all services are stopped
             // so the automation one is the only one running. Settings are not changed so when
             // the automation service goes away the state is restored from the settings.
@@ -556,7 +559,8 @@
         synchronized (mLock) {
             UserState userState = getCurrentUserStateLocked();
             // Stash the old state so we can restore it when the keyguard is gone.
-            mTempStateChangeForCurrentUserMemento.initialize(mCurrentUserId, getCurrentUserStateLocked());
+            mTempStateChangeForCurrentUserMemento.initialize(mCurrentUserId,
+                    getCurrentUserStateLocked());
             // Set the temporary state.
             userState.mIsAccessibilityEnabled = true;
             userState.mIsTouchExplorationEnabled= touchExplorationEnabled;
@@ -579,6 +583,9 @@
                     && serviceClient != null && mUiAutomationService.mServiceInterface
                             .asBinder() == serviceClient.asBinder()) {
                 mUiAutomationService.binderDied();
+            } else {
+                throw new IllegalStateException("UiAutomationService " + serviceClient
+                        + " not registered!");
             }
         }
     }
@@ -935,7 +942,8 @@
         }
 
         if (!event.isImportantForAccessibility()
-                && !service.mIncludeNotImportantViews) {
+                && (service.mFetchFlags
+                        & AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) == 0) {
             return false;
         }
 
@@ -1486,7 +1494,7 @@
 
         boolean mRequestTouchExplorationMode;
 
-        boolean mIncludeNotImportantViews;
+        int mFetchFlags;
 
         long mNotificationTimeout;
 
@@ -1565,10 +1573,15 @@
 
             if (mIsAutomation || info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion
                     >= Build.VERSION_CODES.JELLY_BEAN) {
-                mIncludeNotImportantViews =
-                    (info.flags & FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0;
+                mFetchFlags |= (info.flags
+                        & AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0 ?
+                                AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0;
             }
 
+            mFetchFlags |= (info.flags
+                    & AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS) != 0 ?
+                            AccessibilityNodeInfo.FLAG_REPORT_VIEW_IDS : 0;
+
             mRequestTouchExplorationMode = (info.flags
                     & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
 
@@ -1664,8 +1677,8 @@
         }
 
         @Override
-        public boolean findAccessibilityNodeInfoByViewId(int accessibilityWindowId,
-                long accessibilityNodeId, int viewId, int interactionId,
+        public boolean findAccessibilityNodeInfosByViewId(int accessibilityWindowId,
+                long accessibilityNodeId, String viewIdResName, int interactionId,
                 IAccessibilityInteractionConnectionCallback callback, long interrogatingTid)
                 throws RemoteException {
             final int resolvedWindowId;
@@ -1689,14 +1702,13 @@
                     }
                 }
             }
-            final int flags = (mIncludeNotImportantViews) ?
-                    AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0;
             final int interrogatingPid = Binder.getCallingPid();
             final long identityToken = Binder.clearCallingIdentity();
             MagnificationSpec spec = getCompatibleMagnificationSpec(resolvedWindowId);
             try {
-                connection.findAccessibilityNodeInfoByViewId(accessibilityNodeId, viewId,
-                        interactionId, callback, flags, interrogatingPid, interrogatingTid, spec);
+                connection.findAccessibilityNodeInfosByViewId(accessibilityNodeId,
+                        viewIdResName, interactionId, callback, mFetchFlags, interrogatingPid,
+                        interrogatingTid, spec);
                 return true;
             } catch (RemoteException re) {
                 if (DEBUG) {
@@ -1735,14 +1747,13 @@
                     }
                 }
             }
-            final int flags = (mIncludeNotImportantViews) ?
-                    AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0;
             final int interrogatingPid = Binder.getCallingPid();
             final long identityToken = Binder.clearCallingIdentity();
             MagnificationSpec spec = getCompatibleMagnificationSpec(resolvedWindowId);
             try {
                 connection.findAccessibilityNodeInfosByText(accessibilityNodeId, text,
-                        interactionId, callback, flags, interrogatingPid, interrogatingTid, spec);
+                        interactionId, callback, mFetchFlags, interrogatingPid, interrogatingTid,
+                        spec);
                 return true;
             } catch (RemoteException re) {
                 if (DEBUG) {
@@ -1781,15 +1792,13 @@
                     }
                 }
             }
-            final int allFlags = flags | ((mIncludeNotImportantViews) ?
-                    AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0);
             final int interrogatingPid = Binder.getCallingPid();
             final long identityToken = Binder.clearCallingIdentity();
             MagnificationSpec spec = getCompatibleMagnificationSpec(resolvedWindowId);
             try {
                 connection.findAccessibilityNodeInfoByAccessibilityId(accessibilityNodeId,
-                        interactionId, callback, allFlags, interrogatingPid, interrogatingTid,
-                        spec);
+                        interactionId, callback, mFetchFlags | flags, interrogatingPid,
+                        interrogatingTid, spec);
                 return true;
             } catch (RemoteException re) {
                 if (DEBUG) {
@@ -1828,14 +1837,12 @@
                     }
                 }
             }
-            final int flags = (mIncludeNotImportantViews) ?
-                    AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0;
             final int interrogatingPid = Binder.getCallingPid();
             final long identityToken = Binder.clearCallingIdentity();
             MagnificationSpec spec = getCompatibleMagnificationSpec(resolvedWindowId);
             try {
                 connection.findFocus(accessibilityNodeId, focusType, interactionId, callback,
-                        flags, interrogatingPid, interrogatingTid, spec);
+                        mFetchFlags, interrogatingPid, interrogatingTid, spec);
                 return true;
             } catch (RemoteException re) {
                 if (DEBUG) {
@@ -1874,14 +1881,12 @@
                     }
                 }
             }
-            final int flags = (mIncludeNotImportantViews) ?
-                    AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0;
             final int interrogatingPid = Binder.getCallingPid();
             final long identityToken = Binder.clearCallingIdentity();
             MagnificationSpec spec = getCompatibleMagnificationSpec(resolvedWindowId);
             try {
                 connection.focusSearch(accessibilityNodeId, direction, interactionId, callback,
-                        flags, interrogatingPid, interrogatingTid, spec);
+                        mFetchFlags, interrogatingPid, interrogatingTid, spec);
                 return true;
             } catch (RemoteException re) {
                 if (DEBUG) {
@@ -1920,13 +1925,11 @@
                     }
                 }
             }
-            final int flags = (mIncludeNotImportantViews) ?
-                    AccessibilityNodeInfo.INCLUDE_NOT_IMPORTANT_VIEWS : 0;
             final int interrogatingPid = Binder.getCallingPid();
             final long identityToken = Binder.clearCallingIdentity();
             try {
                 connection.performAccessibilityAction(accessibilityNodeId, action, arguments,
-                        interactionId, callback, flags, interrogatingPid, interrogatingTid);
+                        interactionId, callback, mFetchFlags, interrogatingPid, interrogatingTid);
             } catch (RemoteException re) {
                 if (DEBUG) {
                     Slog.e(LOG_TAG, "Error calling performAccessibilityAction()");
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index d8e199b..ca60a93 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -51,6 +51,7 @@
 import android.app.IServiceConnection;
 import android.app.IStopUserCallback;
 import android.app.IThumbnailReceiver;
+import android.app.IUiAutomationConnection;
 import android.app.IUserSwitchObserver;
 import android.app.Instrumentation;
 import android.app.Notification;
@@ -162,7 +163,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 
-public final class ActivityManagerService extends ActivityManagerNative
+public final class ActivityManagerService  extends ActivityManagerNative
         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
     private static final String USER_DATA_DIR = "/data/user/";
     static final String TAG = "ActivityManager";
@@ -262,6 +263,9 @@
     // Maximum number of users we allow to be running at a time.
     static final int MAX_RUNNING_USERS = 3;
 
+    // How long to wait in getTopActivityExtras for the activity to respond with the result.
+    static final int PENDING_ACTIVITY_RESULT_TIMEOUT = 2*2000;
+
     static final int MY_PID = Process.myPid();
     
     static final String[] EMPTY_STRING_ARRAY = new String[0];
@@ -319,11 +323,32 @@
      * Activity we have told the window manager to have key focus.
      */
     ActivityRecord mFocusedActivity = null;
+
     /**
      * List of intents that were used to start the most recent tasks.
      */
     final ArrayList<TaskRecord> mRecentTasks = new ArrayList<TaskRecord>();
 
+    public class PendingActivityExtras extends Binder implements Runnable {
+        public final ActivityRecord activity;
+        public boolean haveResult = false;
+        public Bundle result = null;
+        public PendingActivityExtras(ActivityRecord _activity) {
+            activity = _activity;
+        }
+        @Override
+        public void run() {
+            Slog.w(TAG, "getTopActivityExtras failed: timeout retrieving from " + activity);
+            synchronized (this) {
+                haveResult = true;
+                notifyAll();
+            }
+        }
+    }
+
+    final ArrayList<PendingActivityExtras> mPendingActivityExtras
+            = new ArrayList<PendingActivityExtras>();
+
     /**
      * Process management.
      */
@@ -4259,8 +4284,9 @@
             }
             thread.bindApplication(processName, appInfo, providers,
                     app.instrumentationClass, profileFile, profileFd, profileAutoStop,
-                    app.instrumentationArguments, app.instrumentationWatcher, testMode,
-                    enableOpenGlTrace, isRestrictedBackupMode || !normalMode, app.persistent,
+                    app.instrumentationArguments, app.instrumentationWatcher,
+                    app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
+                    isRestrictedBackupMode || !normalMode, app.persistent,
                     new Configuration(mConfiguration), app.compat, getCommonServicesLocked(),
                     mCoreSettingsObserver.getCoreSettingsLocked());
             updateLruProcessLocked(app, false);
@@ -7451,6 +7477,63 @@
         return KEY_DISPATCHING_TIMEOUT;
     }
 
+    public Bundle getTopActivityExtras(int requestType) {
+        enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
+                "getTopActivityExtras()");
+        PendingActivityExtras pae;
+        Bundle extras = new Bundle();
+        synchronized (this) {
+            ActivityRecord activity = mMainStack.mResumedActivity;
+            if (activity == null) {
+                Slog.w(TAG, "getTopActivityExtras failed: no resumed activity");
+                return null;
+            }
+            extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
+            if (activity.app == null || activity.app.thread == null) {
+                Slog.w(TAG, "getTopActivityExtras failed: no process for " + activity);
+                return extras;
+            }
+            if (activity.app.pid == Binder.getCallingPid()) {
+                Slog.w(TAG, "getTopActivityExtras failed: request process same as " + activity);
+                return extras;
+            }
+            pae = new PendingActivityExtras(activity);
+            try {
+                activity.app.thread.requestActivityExtras(activity.appToken, pae, requestType);
+                mPendingActivityExtras.add(pae);
+                mHandler.postDelayed(pae, PENDING_ACTIVITY_RESULT_TIMEOUT);
+            } catch (RemoteException e) {
+                Slog.w(TAG, "getTopActivityExtras failed: crash calling " + activity);
+                return extras;
+            }
+        }
+        synchronized (pae) {
+            while (!pae.haveResult) {
+                try {
+                    pae.wait();
+                } catch (InterruptedException e) {
+                }
+            }
+            if (pae.result != null) {
+                extras.putBundle(Intent.EXTRA_ASSIST_CONTEXT, pae.result);
+            }
+        }
+        synchronized (this) {
+            mPendingActivityExtras.remove(pae);
+            mHandler.removeCallbacks(pae);
+        }
+        return extras;
+    }
+
+    public void reportTopActivityExtras(IBinder token, Bundle extras) {
+        PendingActivityExtras pae = (PendingActivityExtras)token;
+        synchronized (pae) {
+            pae.result = extras;
+            pae.haveResult = true;
+            pae.notifyAll();
+        }
+    }
+
     public void registerProcessObserver(IProcessObserver observer) {
         enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
                 "registerProcessObserver()");
@@ -12147,7 +12230,8 @@
 
     public boolean startInstrumentation(ComponentName className,
             String profileFile, int flags, Bundle arguments,
-            IInstrumentationWatcher watcher, int userId) {
+            IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection,
+            int userId) {
         enforceNotIsolatedCaller("startInstrumentation");
         userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
                 userId, false, true, "startInstrumentation", null);
@@ -12201,6 +12285,7 @@
             app.instrumentationProfileFile = profileFile;
             app.instrumentationArguments = arguments;
             app.instrumentationWatcher = watcher;
+            app.instrumentationUiAutomationConnection = uiAutomationConnection;
             app.instrumentationResultClass = className;
             Binder.restoreCallingIdentity(origId);
         }
@@ -12243,7 +12328,15 @@
             } catch (RemoteException e) {
             }
         }
+        if (app.instrumentationUiAutomationConnection != null) {
+            try {
+                app.instrumentationUiAutomationConnection.shutdown();
+            } catch (RemoteException re) {
+                /* ignore */
+            }
+        }
         app.instrumentationWatcher = null;
+        app.instrumentationUiAutomationConnection = null;
         app.instrumentationClass = null;
         app.instrumentationInfo = null;
         app.instrumentationProfileFile = null;
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 749dc66..3af2287 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -123,6 +123,8 @@
     boolean frozenBeforeDestroy;// has been frozen but not yet destroyed.
     boolean immersive;      // immersive mode (don't interrupt if possible)
     boolean forceNewConfig; // force re-create with new config next time
+    int launchCount;        // count of launches since last state
+    long lastLaunchTime;    // time of last lauch of this activity
 
     String stringName;      // for caching of toString().
     
@@ -201,7 +203,12 @@
             }
         }
         pw.print(prefix); pw.print("launchFailed="); pw.print(launchFailed);
-                pw.print(" haveState="); pw.print(haveState);
+                pw.print(" launchCount="); pw.print(launchCount);
+                pw.print(" lastLaunchTime=");
+                if (lastLaunchTime == 0) pw.print("0");
+                else TimeUtils.formatDuration(lastLaunchTime, now, pw);
+                pw.println();
+        pw.print(prefix); pw.print(" haveState="); pw.print(haveState);
                 pw.print(" icicle="); pw.println(icicle);
         pw.print(prefix); pw.print("state="); pw.print(state);
                 pw.print(" stopped="); pw.print(stopped);
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index c1b10cf..de9dda4 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -88,6 +88,7 @@
     static final boolean DEBUG_STATES = false;
     static final boolean DEBUG_ADD_REMOVE = false;
     static final boolean DEBUG_SAVED_STATE = false;
+    static final boolean DEBUG_APP = false;
 
     static final boolean VALIDATE_TOKENS = ActivityManagerService.VALIDATE_TOKENS;
     
@@ -653,6 +654,8 @@
 
         r.app = app;
         app.waitingToKill = null;
+        r.launchCount++;
+        r.lastLaunchTime = SystemClock.uptimeMillis();
 
         if (localLOGV) Slog.v(TAG, "Launching: " + r);
 
@@ -803,7 +806,7 @@
         // Is this activity's application already running?
         ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                 r.info.applicationInfo.uid);
-        
+
         if (r.launchTime == 0) {
             r.launchTime = SystemClock.uptimeMillis();
             if (mInitialStartTime == 0) {
@@ -1091,6 +1094,7 @@
             // haven't really saved the state.
             r.icicle = icicle;
             r.haveState = true;
+            r.launchCount = 0;
             r.updateThumbnail(thumbnail, description);
         }
         if (!r.stopped) {
@@ -3931,6 +3935,7 @@
         if (setState) {
             if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r + " (cleaning up)");
             r.state = ActivityState.DESTROYED;
+            if (DEBUG_APP) Slog.v(TAG, "Clearing app during cleanUp for activity " + r);
             r.app = null;
         }
 
@@ -3988,6 +3993,7 @@
         if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
                 + " (removed from history)");
         r.state = ActivityState.DESTROYED;
+        if (DEBUG_APP) Slog.v(TAG, "Clearing app during remove for activity " + r);
         r.app = null;
         mService.mWindowManager.removeAppToken(r.appToken);
         if (VALIDATE_TOKENS) {
@@ -4130,6 +4136,7 @@
                 if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
                         + " (destroy skipped)");
                 r.state = ActivityState.DESTROYED;
+                if (DEBUG_APP) Slog.v(TAG, "Clearing app during destroy for activity " + r);
                 r.app = null;
             }
         } else {
@@ -4141,6 +4148,7 @@
                 if (DEBUG_STATES) Slog.v(TAG, "Moving to DESTROYED: " + r
                         + " (no app)");
                 r.state = ActivityState.DESTROYED;
+                if (DEBUG_APP) Slog.v(TAG, "Clearing app during destroy for activity " + r);
                 r.app = null;
             }
         }
@@ -4215,7 +4223,21 @@
             if (DEBUG_CLEANUP) Slog.v(
                 TAG, "Record #" + i + " " + r + ": app=" + r.app);
             if (r.app == app) {
+                boolean remove;
                 if ((!r.haveState && !r.stateNotNeeded) || r.finishing) {
+                    // Don't currently have state for the activity, or
+                    // it is finishing -- always remove it.
+                    remove = true;
+                } else if (r.launchCount > 2 &&
+                        r.lastLaunchTime > (SystemClock.uptimeMillis()-60000)) {
+                    // We have launched this activity too many times since it was
+                    // able to run, so give up and remove it.
+                    remove = true;
+                } else {
+                    // The process may be gone, but the activity lives on!
+                    remove = false;
+                }
+                if (remove) {
                     if (ActivityStack.DEBUG_ADD_REMOVE || DEBUG_CLEANUP) {
                         RuntimeException here = new RuntimeException("here");
                         here.fillInStackTrace();
@@ -4242,6 +4264,8 @@
                     if (r.visible) {
                         hasVisibleActivities = true;
                     }
+                    if (DEBUG_APP) Slog.v(TAG, "Clearing app during removeHistory for activity "
+                            + r);
                     r.app = null;
                     r.nowVisible = false;
                     if (!r.haveState) {
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 7fbab04..a32af2f 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -22,6 +22,7 @@
 import android.app.Dialog;
 import android.app.IApplicationThread;
 import android.app.IInstrumentationWatcher;
+import android.app.IUiAutomationConnection;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
@@ -95,6 +96,7 @@
     ApplicationInfo instrumentationInfo; // the application being instrumented
     String instrumentationProfileFile; // where to save profiling
     IInstrumentationWatcher instrumentationWatcher; // who is waiting
+    IUiAutomationConnection instrumentationUiAutomationConnection; // Connection to use the UI introspection APIs.
     Bundle instrumentationArguments;// as given to us
     ComponentName instrumentationResultClass;// copy of instrumentationClass
     boolean usingWrapper;       // Set to true when process was launched with a wrapper attached
diff --git a/services/java/com/android/server/location/GeofenceManager.java b/services/java/com/android/server/location/GeofenceManager.java
index f9be719..e24bf76 100644
--- a/services/java/com/android/server/location/GeofenceManager.java
+++ b/services/java/com/android/server/location/GeofenceManager.java
@@ -21,6 +21,7 @@
 import java.util.LinkedList;
 import java.util.List;
 
+import android.app.AppOpsManager;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
@@ -68,6 +69,7 @@
 
     private final Context mContext;
     private final LocationManager mLocationManager;
+    private final AppOpsManager mAppOps;
     private final PowerManager.WakeLock mWakeLock;
     private final GeofenceHandler mHandler;
     private final LocationBlacklist mBlacklist;
@@ -107,6 +109,7 @@
     public GeofenceManager(Context context, LocationBlacklist blacklist) {
         mContext = context;
         mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
+        mAppOps = (AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE);
         PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
         mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
         mHandler = new GeofenceHandler();
@@ -114,14 +117,14 @@
     }
 
     public void addFence(LocationRequest request, Geofence geofence, PendingIntent intent,
-            int uid, String packageName) {
+            int allowedResolutionLevel, int uid, String packageName) {
         if (D) {
             Slog.d(TAG, "addFence: request=" + request + ", geofence=" + geofence
                     + ", intent=" + intent + ", uid=" + uid + ", packageName=" + packageName);
         }
 
         GeofenceState state = new GeofenceState(geofence,
-                request.getExpireAt(), packageName, intent);
+                request.getExpireAt(), allowedResolutionLevel, uid, packageName, intent);
         synchronized (mLock) {
             // first make sure it doesn't already exist
             for (int i = mFences.size() - 1; i >= 0; i--) {
@@ -261,6 +264,18 @@
                     continue;
                 }
 
+                int op = LocationManagerService.resolutionLevelToOp(state.mAllowedResolutionLevel);
+                if (op >= 0) {
+                    if (mAppOps.noteOpNoThrow(AppOpsManager.OP_FINE_LOCATION, state.mUid,
+                            state.mPackageName) != AppOpsManager.MODE_ALLOWED) {
+                        if (D) {
+                            Slog.d(TAG, "skipping geofence processing for no op app: "
+                                    + state.mPackageName);
+                        }
+                        continue;
+                    }
+                }
+
                 needUpdates = true;
                 if (location != null) {
                     int event = state.processLocation(location);
diff --git a/services/java/com/android/server/location/GeofenceState.java b/services/java/com/android/server/location/GeofenceState.java
index 11705ff..3ebe20a 100644
--- a/services/java/com/android/server/location/GeofenceState.java
+++ b/services/java/com/android/server/location/GeofenceState.java
@@ -35,6 +35,8 @@
     public final Geofence mFence;
     private final Location mLocation;
     public final long mExpireAt;
+    public final int mAllowedResolutionLevel;
+    public final int mUid;
     public final String mPackageName;
     public final PendingIntent mIntent;
 
@@ -42,12 +44,14 @@
     double mDistanceToCenter;  // current distance to center of fence
 
     public GeofenceState(Geofence fence, long expireAt,
-            String packageName, PendingIntent intent) {
+            int allowedResolutionLevel, int uid, String packageName, PendingIntent intent) {
         mState = STATE_UNKNOWN;
         mDistanceToCenter = Double.MAX_VALUE;
 
         mFence = fence;
         mExpireAt = expireAt;
+        mAllowedResolutionLevel = allowedResolutionLevel;
+        mUid = uid;
         mPackageName = packageName;
         mIntent = intent;
 
diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java
index 12c14bf..da150d9 100644
--- a/services/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/java/com/android/server/location/GpsLocationProvider.java
@@ -704,17 +704,17 @@
      */
     @Override
     public void enable() {
+        synchronized (mLock) {
+            if (mEnabled) return;
+            mEnabled = true;
+        }
+
         sendMessage(ENABLE, 1, null);
     }
 
     private void handleEnable() {
         if (DEBUG) Log.d(TAG, "handleEnable");
 
-        synchronized (mLock) {
-            if (mEnabled) return;
-            mEnabled = true;
-        }
-
         boolean enabled = native_init();
 
         if (enabled) {
@@ -740,17 +740,17 @@
      */
     @Override
     public void disable() {
+        synchronized (mLock) {
+            if (!mEnabled) return;
+            mEnabled = false;
+        }
+
         sendMessage(ENABLE, 0, null);
     }
 
     private void handleDisable() {
         if (DEBUG) Log.d(TAG, "handleDisable");
 
-        synchronized (mLock) {
-            if (!mEnabled) return;
-            mEnabled = false;
-        }
-
         stopNavigating();
         mAlarmManager.cancel(mWakeupIntent);
         mAlarmManager.cancel(mTimeoutIntent);
diff --git a/services/java/com/android/server/location/LocationBlacklist.java b/services/java/com/android/server/location/LocationBlacklist.java
index 2437a37..6f22689 100644
--- a/services/java/com/android/server/location/LocationBlacklist.java
+++ b/services/java/com/android/server/location/LocationBlacklist.java
@@ -67,9 +67,9 @@
 
     private void reloadBlacklistLocked() {
         mWhitelist = getStringArrayLocked(WHITELIST_CONFIG_NAME);
-        Slog.i(TAG, "whitelist: " + Arrays.toString(mWhitelist));
+        if (D) Slog.d(TAG, "whitelist: " + Arrays.toString(mWhitelist));
         mBlacklist = getStringArrayLocked(BLACKLIST_CONFIG_NAME);
-        Slog.i(TAG, "blacklist: " + Arrays.toString(mBlacklist));
+        if (D) Slog.d(TAG, "blacklist: " + Arrays.toString(mBlacklist));
     }
 
     private void reloadBlacklist() {
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 47987f1..829e67a 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -20,6 +20,7 @@
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
 import static com.android.internal.util.ArrayUtils.appendInt;
@@ -172,7 +173,7 @@
 public class PackageManagerService extends IPackageManager.Stub {
     static final String TAG = "PackageManager";
     static final boolean DEBUG_SETTINGS = false;
-    private static final boolean DEBUG_PREFERRED = false;
+    static final boolean DEBUG_PREFERRED = true;
     static final boolean DEBUG_UPGRADE = false;
     private static final boolean DEBUG_INSTALL = false;
     private static final boolean DEBUG_REMOVE = false;
@@ -1020,7 +1021,7 @@
 
             readPermissions();
 
-            mRestoredSettings = mSettings.readLPw(sUserManager.getUsers(false),
+            mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false),
                     mSdkVersion, mOnlyCore);
             long startTime = SystemClock.uptimeMillis();
 
@@ -1347,7 +1348,8 @@
                 continue;
             }
 
-            if (!ps.grantedPermissions
+            final GrantedPermissions gp = ps.sharedUser != null ? ps.sharedUser : ps;
+            if (!gp.grantedPermissions
                     .contains(android.Manifest.permission.PACKAGE_VERIFICATION_AGENT)) {
                 continue;
             }
@@ -2917,8 +2919,9 @@
     private void addPackageHoldingPermissions(ArrayList<PackageInfo> list, PackageSetting ps,
             String[] permissions, boolean[] tmp, int flags, int userId) {
         int numMatch = 0;
+        final GrantedPermissions gp = ps.sharedUser != null ? ps.sharedUser : ps;
         for (int i=0; i<permissions.length; i++) {
-            if (ps.grantedPermissions.contains(permissions[i])) {
+            if (gp.grantedPermissions.contains(permissions[i])) {
                 tmp[i] = true;
                 numMatch++;
             } else {
@@ -3296,6 +3299,13 @@
                     Log.i(TAG, "Package " + ps.name + " at " + scanFile
                             + " ignored: updated version " + ps.versionCode
                             + " better than this " + pkg.mVersionCode);
+                    if (!updatedPkg.codePath.equals(scanFile)) {
+                        Slog.w(PackageManagerService.TAG, "Code path for hidden system pkg : "
+                                + ps.name + " changing from " + updatedPkg.codePathString
+                                + " to " + scanFile);
+                        updatedPkg.codePath = scanFile;
+                        updatedPkg.codePathString = scanFile.toString();                        
+                    }
                     mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
                     return null;
                 } else {
@@ -4957,7 +4967,7 @@
         ps.haveGids = true;
     }
     
-    private final class ActivityIntentResolver
+    final class ActivityIntentResolver
             extends IntentResolver<PackageParser.ActivityIntentInfo, ResolveInfo> {
         public List<ResolveInfo> queryIntent(Intent intent, String resolvedType,
                 boolean defaultOnly, int userId) {
@@ -8820,8 +8830,10 @@
                 }
             }
 
-            if (clearPackagePreferredActivitiesLPw(packageName, UserHandle.getCallingUserId())) {
-                scheduleWriteSettingsLocked();            
+            int user = UserHandle.getCallingUserId();
+            if (clearPackagePreferredActivitiesLPw(packageName, user)) {
+                mSettings.writePackageRestrictionsLPr(user);
+                scheduleWriteSettingsLocked();
             }
         }
     }
@@ -8839,7 +8851,8 @@
             Iterator<PreferredActivity> it = pir.filterIterator();
             while (it.hasNext()) {
                 PreferredActivity pa = it.next();
-                if (pa.mPref.mComponent.getPackageName().equals(packageName)) {
+                if (packageName == null ||
+                        pa.mPref.mComponent.getPackageName().equals(packageName)) {
                     if (removed == null) {
                         removed = new ArrayList<PreferredActivity>();
                     }
@@ -8852,12 +8865,24 @@
                     pir.removeFilter(pa);
                 }
                 changed = true;
-                mSettings.writePackageRestrictionsLPr(thisUserId);
             }
         }
         return changed;
     }
 
+    public void resetPreferredActivities(int userId) {
+        mContext.enforceCallingOrSelfPermission(
+                android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
+        // writer
+        synchronized (mPackages) {
+            int user = UserHandle.getCallingUserId();
+            clearPackagePreferredActivitiesLPw(null, user);
+            mSettings.readDefaultPreferredAppsLPw(this, user);
+            mSettings.writePackageRestrictionsLPr(user);
+            scheduleWriteSettingsLocked();
+        }
+    }
+
     public int getPreferredActivities(List<IntentFilter> outFilters,
             List<ComponentName> outActivities, String packageName) {
 
@@ -8906,13 +8931,14 @@
         if (!(newState == COMPONENT_ENABLED_STATE_DEFAULT
               || newState == COMPONENT_ENABLED_STATE_ENABLED
               || newState == COMPONENT_ENABLED_STATE_DISABLED
-              || newState == COMPONENT_ENABLED_STATE_DISABLED_USER)) {
+              || newState == COMPONENT_ENABLED_STATE_DISABLED_USER
+              || newState == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED)) {
             throw new IllegalArgumentException("Invalid new component state: "
                     + newState);
         }
         PackageSetting pkgSetting;
         final int uid = Binder.getCallingUid();
-        final int permission = mContext.checkCallingPermission(
+        final int permission = mContext.checkCallingOrSelfPermission(
                 android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
         enforceCrossUserPermission(uid, userId, false, "set enabled");
         final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
@@ -9243,6 +9269,7 @@
         }
 
         DumpState dumpState = new DumpState();
+        boolean fullPreferred = false;
         
         String packageName = null;
         
@@ -9266,7 +9293,7 @@
                 pw.println("    r[esolvers]: dump intent resolvers");
                 pw.println("    perm[issions]: dump permissions");
                 pw.println("    pref[erred]: print preferred package settings");
-                pw.println("    preferred-xml: print preferred package settings as xml");
+                pw.println("    preferred-xml [--full]: print preferred package settings as xml");
                 pw.println("    prov[iders]: dump content providers");
                 pw.println("    p[ackages]: dump installed packages");
                 pw.println("    s[hared-users]: dump shared user IDs");
@@ -9300,6 +9327,10 @@
                 dumpState.setDump(DumpState.DUMP_PREFERRED);
             } else if ("preferred-xml".equals(cmd)) {
                 dumpState.setDump(DumpState.DUMP_PREFERRED_XML);
+                if (opti < args.length && "--full".equals(args[opti])) {
+                    fullPreferred = true;
+                    opti++;
+                }
             } else if ("p".equals(cmd) || "packages".equals(cmd)) {
                 dumpState.setDump(DumpState.DUMP_PACKAGES);
             } else if ("s".equals(cmd) || "shared-users".equals(cmd)) {
@@ -9394,7 +9425,7 @@
                     serializer.startDocument(null, true);
                     serializer.setFeature(
                             "http://xmlpull.org/v1/doc/features.html#indent-output", true);
-                    mSettings.writePreferredActivitiesLPr(serializer, 0);
+                    mSettings.writePreferredActivitiesLPr(serializer, 0, fullPreferred);
                     serializer.endDocument();
                     serializer.flush();
                 } catch (IllegalArgumentException e) {
@@ -10147,7 +10178,7 @@
     /** Called by UserManagerService */
     void createNewUserLILPw(int userHandle, File path) {
         if (mInstaller != null) {
-            mSettings.createNewUserLILPw(mInstaller, userHandle, path);
+            mSettings.createNewUserLILPw(this, mInstaller, userHandle, path);
         }
     }
 
diff --git a/services/java/com/android/server/pm/PreferredActivity.java b/services/java/com/android/server/pm/PreferredActivity.java
index dbf56ef..c655bb1 100644
--- a/services/java/com/android/server/pm/PreferredActivity.java
+++ b/services/java/com/android/server/pm/PreferredActivity.java
@@ -46,8 +46,8 @@
         mPref = new PreferredComponent(this, parser);
     }
 
-    public void writeToXml(XmlSerializer serializer) throws IOException {
-        mPref.writeToXml(serializer);
+    public void writeToXml(XmlSerializer serializer, boolean full) throws IOException {
+        mPref.writeToXml(serializer, full);
         serializer.startTag(null, "filter");
             super.writeToXml(serializer);
         serializer.endTag(null, "filter");
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index 06f11bc..13f514b 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -18,10 +18,17 @@
 
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.os.PatternMatcher;
+import android.util.LogPrinter;
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.JournaledFile;
 import com.android.internal.util.XmlUtils;
@@ -971,14 +978,14 @@
         return components;
     }
 
-    void writePreferredActivitiesLPr(XmlSerializer serializer, int userId)
+    void writePreferredActivitiesLPr(XmlSerializer serializer, int userId, boolean full)
             throws IllegalArgumentException, IllegalStateException, IOException {
         serializer.startTag(null, "preferred-activities");
         PreferredIntentResolver pir = mPreferredActivities.get(userId);
         if (pir != null) {
             for (final PreferredActivity pa : pir.filterSet()) {
                 serializer.startTag(null, TAG_ITEM);
-                pa.writeToXml(serializer);
+                pa.writeToXml(serializer, full);
                 serializer.endTag(null, TAG_ITEM);
             }
         }
@@ -1071,7 +1078,7 @@
                 }
             }
 
-            writePreferredActivitiesLPr(serializer, userId);
+            writePreferredActivitiesLPr(serializer, userId, true);
 
             serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
 
@@ -1556,7 +1563,8 @@
         }
     }
 
-    boolean readLPw(List<UserInfo> users, int sdkVersion, boolean onlyCore) {
+    boolean readLPw(PackageManagerService service, List<UserInfo> users, int sdkVersion,
+            boolean onlyCore) {
         FileInputStream str = null;
         if (mBackupSettingsFilename.exists()) {
             try {
@@ -1587,7 +1595,7 @@
                     PackageManagerService.reportSettingsProblem(Log.INFO,
                             "No settings file; creating initial state");
                     if (!onlyCore) {
-                        readDefaultPreferredAppsLPw(0);
+                        readDefaultPreferredAppsLPw(service, 0);
                     }
                     mInternalSdkPlatform = mExternalSdkPlatform = sdkVersion;
                     return false;
@@ -1770,7 +1778,7 @@
         return true;
     }
 
-    private void readDefaultPreferredAppsLPw(int userId) {
+    void readDefaultPreferredAppsLPw(PackageManagerService service, int userId) {
         // Read preferred apps from .../etc/preferred-apps directory.
         File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
         if (!preferredDir.exists() || !preferredDir.isDirectory()) {
@@ -1792,6 +1800,7 @@
                 continue;
             }
 
+            if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Reading default preferred " + f);
             FileInputStream str = null;
             try {
                 str = new FileInputStream(f);
@@ -1813,7 +1822,7 @@
                             + " does not start with 'preferred-activities'");
                     continue;
                 }
-                readPreferredActivitiesLPw(parser, userId);
+                readDefaultPreferredActivitiesLPw(service, parser, userId);
             } catch (XmlPullParserException e) {
                 Slog.w(TAG, "Error reading apps file " + f, e);
             } catch (IOException e) {
@@ -1829,6 +1838,112 @@
         }
     }
 
+    private void readDefaultPreferredActivitiesLPw(PackageManagerService service,
+            XmlPullParser parser, int userId)
+            throws XmlPullParserException, IOException {
+        int outerDepth = parser.getDepth();
+        int type;
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+                continue;
+            }
+
+            String tagName = parser.getName();
+            if (tagName.equals(TAG_ITEM)) {
+                PreferredActivity tmpPa = new PreferredActivity(parser);
+                if (tmpPa.mPref.getParseError() == null) {
+                    // The initial preferences only specify the target activity
+                    // component and intent-filter, not the set of matches.  So we
+                    // now need to query for the matches to build the correct
+                    // preferred activity entry.
+                    if (PackageManagerService.DEBUG_PREFERRED) {
+                        Log.d(TAG, "Processing preferred:");
+                        tmpPa.dump(new LogPrinter(Log.DEBUG, TAG), "  ");
+                    }
+                    final ComponentName cn = tmpPa.mPref.mComponent;
+                    Intent intent = new Intent();
+                    int flags = 0;
+                    intent.setAction(tmpPa.getAction(0));
+                    for (int i=0; i<tmpPa.countCategories(); i++) {
+                        String cat = tmpPa.getCategory(i);
+                        if (cat.equals(Intent.CATEGORY_DEFAULT)) {
+                            flags |= PackageManager.MATCH_DEFAULT_ONLY;
+                        } else {
+                            intent.addCategory(cat);
+                        }
+                    }
+                    if (tmpPa.countDataSchemes() > 0) {
+                        Uri.Builder builder = new Uri.Builder();
+                        builder.scheme(tmpPa.getDataScheme(0));
+                        if (tmpPa.countDataAuthorities() > 0) {
+                            IntentFilter.AuthorityEntry auth = tmpPa.getDataAuthority(0);
+                            if (auth.getHost() != null) {
+                                builder.authority(auth.getHost());
+                            }
+                        }
+                        if (tmpPa.countDataPaths() > 0) {
+                            PatternMatcher path = tmpPa.getDataPath(0);
+                            builder.path(path.getPath());
+                        }
+                        intent.setData(builder.build());
+                    } else if (tmpPa.countDataTypes() > 0) {
+                        intent.setType(tmpPa.getDataType(0));
+                    }
+                    List<ResolveInfo> ri = service.mActivities.queryIntent(intent,
+                            intent.getType(), flags, 0);
+                    if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Queried " + intent
+                            + " results: " + ri);
+                    int match = 0;
+                    if (ri != null && ri.size() > 1) {
+                        boolean haveAct = false;
+                        boolean haveNonSys = false;
+                        ComponentName[] set = new ComponentName[ri.size()];
+                        for (int i=0; i<ri.size(); i++) {
+                            ActivityInfo ai = ri.get(i).activityInfo;
+                            set[i] = new ComponentName(ai.packageName, ai.name);
+                            if ((ai.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
+                                // If any of the matches are not system apps, then
+                                // there is a third party app that is now an option...
+                                // so don't set a default since we don't want to hide it.
+                                if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
+                                        + ai.packageName + "/" + ai.name + ": non-system!");
+                                haveNonSys = true;
+                                break;
+                            } else if (cn.getPackageName().equals(ai.packageName)
+                                    && cn.getClassName().equals(ai.name)) {
+                                if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
+                                        + ai.packageName + "/" + ai.name + ": default!");
+                                haveAct = true;
+                                match = ri.get(i).match;
+                            } else {
+                                if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
+                                        + ai.packageName + "/" + ai.name + ": skipped");
+                            }
+                        }
+                        if (haveAct && !haveNonSys) {
+                            PreferredActivity pa = new PreferredActivity(tmpPa, match, set,
+                                    tmpPa.mPref.mComponent);
+                            editPreferredActivitiesLPw(userId).addFilter(pa);
+                        } else if (!haveNonSys) {
+                            Slog.w(TAG, "No component found for default preferred activity "
+                                    + tmpPa.mPref.mComponent);
+                        }
+                    }
+                } else {
+                    PackageManagerService.reportSettingsProblem(Log.WARN,
+                            "Error in package manager settings: <preferred-activity> "
+                                    + tmpPa.mPref.getParseError() + " at "
+                                    + parser.getPositionDescription());
+                }
+            } else {
+                PackageManagerService.reportSettingsProblem(Log.WARN,
+                        "Unknown element under <preferred-activities>: " + parser.getName());
+                XmlUtils.skipCurrentTag(parser);
+            }
+        }
+    }
+
     private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
         String v = parser.getAttributeValue(ns, name);
         try {
@@ -2328,7 +2443,8 @@
         }
     }
 
-    void createNewUserLILPw(Installer installer, int userHandle, File path) {
+    void createNewUserLILPw(PackageManagerService service, Installer installer,
+            int userHandle, File path) {
         path.mkdir();
         FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG
                 | FileUtils.S_IXOTH, -1, -1);
@@ -2339,7 +2455,7 @@
             installer.createUserData(ps.name,
                     UserHandle.getUid(userHandle, ps.appId), userHandle);
         }
-        readDefaultPreferredAppsLPw(userHandle);
+        readDefaultPreferredAppsLPw(service, userHandle);
         writePackageRestrictionsLPr(userHandle);
     }
 
@@ -2412,8 +2528,14 @@
             return false;
         }
         PackageUserState ustate = packageSettings.readUserState(userId);
+        if ((flags&PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0) {
+            if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+                return true;
+            }
+        }
         if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED
                 || ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
+                || ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
                 || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
                     && ustate.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
             return false;
diff --git a/services/java/com/android/server/usb/UsbDeviceManager.java b/services/java/com/android/server/usb/UsbDeviceManager.java
index c7c2c62..8fa6de5 100644
--- a/services/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/java/com/android/server/usb/UsbDeviceManager.java
@@ -169,7 +169,9 @@
             startAccessoryMode();
         }
 
-        if ("1".equals(SystemProperties.get("ro.adb.secure"))) {
+        boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);
+        boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));
+        if (secureAdbEnabled && !dataEncrypted) {
             mDebuggingManager = new UsbDebuggingManager(context);
         }
     }
diff --git a/services/java/com/android/server/usb/UsbSettingsManager.java b/services/java/com/android/server/usb/UsbSettingsManager.java
index 4b2bbfe..f9aaa17 100644
--- a/services/java/com/android/server/usb/UsbSettingsManager.java
+++ b/services/java/com/android/server/usb/UsbSettingsManager.java
@@ -364,8 +364,9 @@
         }
 
         @Override
-        public void onPackageChanged(String packageName, int uid, String[] components) {
+        public boolean onPackageChanged(String packageName, int uid, String[] components) {
             handlePackageUpdate(packageName);
+            return false;
         }
 
         @Override
diff --git a/services/java/com/android/server/wm/DisplayMagnifier.java b/services/java/com/android/server/wm/DisplayMagnifier.java
index d3c01f0..6e876f6 100644
--- a/services/java/com/android/server/wm/DisplayMagnifier.java
+++ b/services/java/com/android/server/wm/DisplayMagnifier.java
@@ -228,6 +228,10 @@
         return spec;
     }
 
+    public void destroyLocked() {
+        mMagnifedViewport.destroyWindow();
+    }
+
     /** NOTE: This has to be called within a surface transaction. */
     public void drawMagnifiedRegionBorderIfNeededLocked() {
         mMagnifedViewport.drawWindowIfNeededLocked();
@@ -258,7 +262,7 @@
         private final int mBorderWidth;
         private final int mHalfBorderWidth;
 
-        private ViewportWindow mWindow;
+        private final ViewportWindow mWindow;
 
         private boolean mFullRedrawNeeded;
 
@@ -459,6 +463,10 @@
             mWindow.drawIfNeeded();
         }
 
+        public void destroyWindow() {
+            mWindow.releaseSurface();
+        }
+
         private final class ViewportWindow {
             private static final String SURFACE_TITLE = "Magnification Overlay";
 
@@ -640,6 +648,10 @@
                     }
                 }
             }
+
+            public void releaseSurface() {
+                mSurface.release();
+            }
         }
     }
 
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index ff2dc0f..1e5cd54 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -3039,7 +3039,10 @@
                 mDisplayMagnifier = new DisplayMagnifier(this, callbacks);
             } else {
                 if (callbacks == null) {
-                    mDisplayMagnifier = null;
+                    if (mDisplayMagnifier != null) {
+                        mDisplayMagnifier.destroyLocked();
+                        mDisplayMagnifier = null;
+                    }
                 } else {
                     throw new IllegalStateException("Magnification callbacks already set!");
                 }
@@ -5598,6 +5601,11 @@
     }
 
     @Override
+    public boolean isRotationFrozen() {
+        return mPolicy.getUserRotationMode() == WindowManagerPolicy.USER_ROTATION_LOCKED;
+    }
+
+    @Override
     public int watchRotation(IRotationWatcher watcher) {
         final IBinder watcherBinder = watcher.asBinder();
         IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
diff --git a/services/jni/com_android_server_input_InputManagerService.cpp b/services/jni/com_android_server_input_InputManagerService.cpp
index a97becf..57803e3 100644
--- a/services/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/jni/com_android_server_input_InputManagerService.cpp
@@ -975,6 +975,11 @@
 static jint nativeInit(JNIEnv* env, jclass clazz,
         jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
     sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
+    if (messageQueue == NULL) {
+        jniThrowRuntimeException(env, "MessageQueue is not initialized.");
+        return 0;
+    }
+
     NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
             messageQueue->getLooper());
     im->incStrong(serviceObj);
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 167b6c2..47ce130 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -557,6 +557,25 @@
         }
     }
 
+    public void testCycleTodayJanuary() throws Exception {
+        final NetworkPolicy policy = new NetworkPolicy(
+                sTemplateWifi, 14, "US/Pacific", 1024L, 1024L, false);
+
+        assertTimeEquals(parseTime("2013-01-14T00:00:00.000-08:00"),
+                computeNextCycleBoundary(parseTime("2013-01-13T23:59:59.000-08:00"), policy));
+        assertTimeEquals(parseTime("2013-02-14T00:00:00.000-08:00"),
+                computeNextCycleBoundary(parseTime("2013-01-14T00:00:01.000-08:00"), policy));
+        assertTimeEquals(parseTime("2013-02-14T00:00:00.000-08:00"),
+                computeNextCycleBoundary(parseTime("2013-01-14T15:11:00.000-08:00"), policy));
+
+        assertTimeEquals(parseTime("2012-12-14T00:00:00.000-08:00"),
+                computeLastCycleBoundary(parseTime("2013-01-13T23:59:59.000-08:00"), policy));
+        assertTimeEquals(parseTime("2013-01-14T00:00:00.000-08:00"),
+                computeLastCycleBoundary(parseTime("2013-01-14T00:00:01.000-08:00"), policy));
+        assertTimeEquals(parseTime("2013-01-14T00:00:00.000-08:00"),
+                computeLastCycleBoundary(parseTime("2013-01-14T15:11:00.000-08:00"), policy));
+    }
+
     public void testNetworkPolicyAppliedCycleLastMonth() throws Exception {
         NetworkState[] state = null;
         NetworkStats stats = null;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index 0f531b7..1ab5f45 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -139,7 +139,7 @@
         // Write the package files and make sure they're parsed properly the first time
         writeOldFiles();
         Settings settings = new Settings(getContext(), getContext().getFilesDir());
-        assertEquals(true, settings.readLPw(null, 0, false));
+        assertEquals(true, settings.readLPw(null, null, 0, false));
         assertNotNull(settings.peekPackageLPr(PACKAGE_NAME_3));
         assertNotNull(settings.peekPackageLPr(PACKAGE_NAME_1));
 
@@ -157,11 +157,11 @@
         // Write the package files and make sure they're parsed properly the first time
         writeOldFiles();
         Settings settings = new Settings(getContext(), getContext().getFilesDir());
-        assertEquals(true, settings.readLPw(null, 0, false));
+        assertEquals(true, settings.readLPw(null, null, 0, false));
 
         // Create Settings again to make it read from the new files
         settings = new Settings(getContext(), getContext().getFilesDir());
-        assertEquals(true, settings.readLPw(null, 0, false));
+        assertEquals(true, settings.readLPw(null, null, 0, false));
 
         PackageSetting ps = settings.peekPackageLPr(PACKAGE_NAME_2);
         assertEquals(COMPONENT_ENABLED_STATE_DISABLED_USER, ps.getEnabled(0));
@@ -172,7 +172,7 @@
         // Write the package files and make sure they're parsed properly the first time
         writeOldFiles();
         Settings settings = new Settings(getContext(), getContext().getFilesDir());
-        assertEquals(true, settings.readLPw(null, 0, false));
+        assertEquals(true, settings.readLPw(null, null, 0, false));
 
         // Enable/Disable a package
         PackageSetting ps = settings.peekPackageLPr(PACKAGE_NAME_1);
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index e2da53e..3ed9cef 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -335,7 +335,7 @@
         mCdmaEcio = (mCdmaEcio > 0) ? -mCdmaEcio : -160;
 
         mEvdoDbm = (mEvdoDbm > 0) ? -mEvdoDbm : -120;
-        mEvdoEcio = (mEvdoEcio > 0) ? -mEvdoEcio : -1;
+        mEvdoEcio = (mEvdoEcio >= 0) ? -mEvdoEcio : -1;
         mEvdoSnr = ((mEvdoSnr > 0) && (mEvdoSnr <= 8)) ? mEvdoSnr : -1;
 
         // TS 36.214 Physical Layer Section 5.1.3, TS 36.331 RRC
diff --git a/test-runner/src/android/test/AndroidTestRunner.java b/test-runner/src/android/test/AndroidTestRunner.java
index 30876d0..aa7c677 100644
--- a/test-runner/src/android/test/AndroidTestRunner.java
+++ b/test-runner/src/android/test/AndroidTestRunner.java
@@ -21,6 +21,7 @@
 import android.os.PerformanceCollector.PerformanceResultsWriter;
 
 import com.google.android.collect.Lists;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestListener;
diff --git a/test-runner/src/android/test/InstrumentationTestRunner.java b/test-runner/src/android/test/InstrumentationTestRunner.java
index 8e30875..91d04da 100644
--- a/test-runner/src/android/test/InstrumentationTestRunner.java
+++ b/test-runner/src/android/test/InstrumentationTestRunner.java
@@ -390,12 +390,11 @@
     }
 
     /**
-     * Get the Bundle object that contains the arguments
+     * Get the arguments passed to this instrumentation.
      *
      * @return the Bundle object
-     * @hide
      */
-    public Bundle getBundle(){
+    public Bundle getArguments() {
         return mArguments;
     }
 
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index e2cb65d..6b9f4c3 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -60,7 +60,7 @@
     public void testMeasureStartUpTime() throws RemoteException {
         InstrumentationTestRunner instrumentation =
                 (InstrumentationTestRunner)getInstrumentation();
-        Bundle args = instrumentation.getBundle();
+        Bundle args = instrumentation.getArguments();
         mAm = ActivityManagerNative.getDefault();
 
         createMappings();
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ClipRegionActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ClipRegionActivity.java
index 3d3d709..774811e 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ClipRegionActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ClipRegionActivity.java
@@ -61,6 +61,7 @@
 
         public RegionView(Context c) {
             super(c);
+            setAlpha(0.5f);
         }
 
         public float getClipPosition() {
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs
index 2818bf5..03e5a79 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/bwfilter.rs
@@ -16,7 +16,7 @@
 
 #pragma version(1)
 #pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
+//#pragma rs_fp_relaxed
 
 static float sr = 0.f;
 static float sg = 0.f;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs
index 81cb9d0..7ee3405 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/shadows.rs
@@ -16,7 +16,7 @@
 
 #pragma version(1)
 #pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
+//#pragma rs_fp_relaxed
 
 static double shadowFilterMap[] = {
     -0.00591,  0.0001,
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs
index 677e857..fae94a1 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vibrance.rs
@@ -16,7 +16,6 @@
 
 #pragma version(1)
 #pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
 
 float vibrance = 0.f;
 
@@ -39,7 +38,7 @@
     int g = in->g;
     int b = in->b;
     float red = (r-max(g, b))/256.f;
-    float sx = (float)(Vib/(1+exp(-red*3)));
+    float sx = (float)(Vib/(1+native_exp(-red*3)));
     S = sx+1;
     MS = 1.0f - S;
     Rt = Rf * MS;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh
index 05a5929..5668621 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/vignette_approx.rsh
@@ -50,8 +50,7 @@
     const float2 inCoord = {(float)x, (float)y};
     const float2 coord = mad(inCoord, inv_dimensions, neg_center);
     const float sloped_dist_ratio = fast_length(axis_scale * coord)  * sloped_inv_max_dist;
-    // TODO:  add half_exp once implemented
-    const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * exp(sloped_dist_ratio));
+    const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * native_exp(sloped_dist_ratio));
     float4 fout;
     fout.rgb = fin.rgb * lumen;
     fout.w = fin.w;
diff --git a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs
index b9c28fc..8c825f2 100644
--- a/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs
+++ b/tests/RenderScriptTests/ImageProcessing/src/com/android/rs/image/wbalance.rs
@@ -16,7 +16,7 @@
 
 #pragma version(1)
 #pragma rs java_package_name(com.android.rs.image)
-#pragma rs_fp_relaxed
+//#pragma rs_fp_relaxed
 
 static int histR[256] = {0}, histG[256] = {0}, histB[256] = {0};
 
diff --git a/tests/RenderScriptTests/MathErr/Android.mk b/tests/RenderScriptTests/MathErr/Android.mk
new file mode 100644
index 0000000..b3edd02
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/Android.mk
@@ -0,0 +1,27 @@
+#
+# Copyright (C) 2013 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+                   $(call all-renderscript-files-under, src)
+
+LOCAL_PACKAGE_NAME := RsMathErr
+
+include $(BUILD_PACKAGE)
diff --git a/tests/RenderScriptTests/MathErr/AndroidManifest.xml b/tests/RenderScriptTests/MathErr/AndroidManifest.xml
new file mode 100644
index 0000000..6a3db2c
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.rs.matherr">
+
+    <uses-sdk android:minSdkVersion="17" />
+    <application android:label="RS Math Err">
+        <activity android:name="MathErrActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tests/RenderScriptTests/MathErr/res/layout/main.xml b/tests/RenderScriptTests/MathErr/res/layout/main.xml
new file mode 100644
index 0000000..7b2c76a
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/res/layout/main.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/displayin"
+        android:layout_width="320dip"
+        android:layout_height="266dip" />
+
+    <ImageView
+        android:id="@+id/displayout"
+        android:layout_width="320dip"
+        android:layout_height="266dip" />
+
+</LinearLayout>
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java
new file mode 100644
index 0000000..4561267
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErr.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2013 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.example.android.rs.matherr;
+
+import android.content.res.Resources;
+import android.renderscript.*;
+import java.lang.Float;
+import java.lang.Math;
+
+public class MathErr {
+    private RenderScript mRS;
+    private Allocation mAllocationSrc;
+    private Allocation mAllocationRes;
+    private ScriptC_math_err mScript;
+    private java.util.Random mRand = new java.util.Random();
+
+    private final int BUF_SIZE = 4096;
+    float mSrc[] = new float[BUF_SIZE];
+    float mRef[] = new float[BUF_SIZE];
+    float mRes[] = new float[BUF_SIZE];
+
+    MathErr(RenderScript rs) {
+        mRS = rs;
+        mScript = new ScriptC_math_err(mRS);
+
+        mAllocationSrc = Allocation.createSized(rs, Element.F32(rs), BUF_SIZE);
+        mAllocationRes = Allocation.createSized(rs, Element.F32(rs), BUF_SIZE);
+
+        testExp2();
+        testLog2();
+    }
+
+    void buildRand() {
+        for (int i=0; i < BUF_SIZE; i++) {
+            mSrc[i] = (((float)i) / 9) - 200;
+            //mSrc[i] = Float.intBitsToFloat(mRand.nextInt());
+        }
+        mAllocationSrc.copyFrom(mSrc);
+    }
+
+    void logErr() {
+        mAllocationRes.copyTo(mRes);
+        for (int i=0; i < BUF_SIZE; i++) {
+            int err = Float.floatToRawIntBits(mRef[i]) - Float.floatToRawIntBits(mRes[i]);
+            err = Math.abs(err);
+            if (err > 8096) {
+                android.util.Log.v("err", "error " + err + " src " + mSrc[i] + " ref " + mRef[i] + " res " + mRes[i]);
+            }
+        }
+    }
+
+    void testExp2() {
+        android.util.Log.v("err", "testing exp2");
+        buildRand();
+        mScript.forEach_testExp2(mAllocationSrc, mAllocationRes);
+        for (int i=0; i < BUF_SIZE; i++) {
+            mRef[i] = (float)Math.pow(2.f, mSrc[i]);
+        }
+        logErr();
+    }
+
+    void testLog2() {
+        android.util.Log.v("err", "testing log2");
+        buildRand();
+        mScript.forEach_testLog2(mAllocationSrc, mAllocationRes);
+        for (int i=0; i < BUF_SIZE; i++) {
+            mRef[i] = (float)Math.log(mSrc[i]) * 1.442695041f;
+        }
+        logErr();
+    }
+
+}
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java
new file mode 100644
index 0000000..74d7b71
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/MathErrActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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.example.android.rs.matherr;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.renderscript.RenderScript;
+import android.renderscript.Allocation;
+import android.util.Log;
+
+public class MathErrActivity extends Activity {
+    private MathErr mME;
+    private RenderScript mRS;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main);
+
+        mRS = RenderScript.create(this);
+        mME = new MathErr(mRS);
+    }
+}
diff --git a/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs
new file mode 100644
index 0000000..a26770b
--- /dev/null
+++ b/tests/RenderScriptTests/MathErr/src/com/example/android/rs/matherr/math_err.rs
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(com.example.android.rs.matherr)
+
+typedef union
+{
+  float fv;
+  int32_t iv;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float.  */
+
+#define GET_FLOAT_WORD(i,d)         \
+do {                                \
+  ieee_float_shape_type gf_u;       \
+  gf_u.fv = (d);                    \
+  (i) = gf_u.iv;                    \
+} while (0)
+
+/* Set a float from a 32 bit int.  */
+
+#define SET_FLOAT_WORD(d,i)         \
+do {                                \
+  ieee_float_shape_type sf_u;       \
+  sf_u.iv = (i);                    \
+  (d) = sf_u.fv;                    \
+} while (0)
+
+
+static float fast_log2(float v) {
+    int32_t ibits;
+    GET_FLOAT_WORD(ibits, v);
+
+    int32_t e = (ibits >> 23) & 0xff;
+
+    ibits &= 0x7fffff;
+    ibits |= 127 << 23;
+
+    float ir;
+    SET_FLOAT_WORD(ir, ibits);
+
+    ir -= 1.5f;
+    float ir2 = ir*ir;
+    float adj2 = 0.405465108f + // -0.00009f +
+                 (0.666666667f * ir) -
+                 (0.222222222f * ir2) +
+                 (0.098765432f * ir*ir2) -
+                 (0.049382716f * ir2*ir2) +
+                 (0.026337449f * ir*ir2*ir2) -
+                 (0.014631916f * ir2*ir2*ir2);
+    adj2 *= (1.f / 0.693147181f);
+
+    return (float)(e - 127) + adj2;
+}
+
+void testExp2(const float *in, float *out) {
+    float i = *in;
+    if (i > (-125.f) && i < 125.f) {
+        *out = native_exp2(i);
+    } else {
+        *out = exp2(i);
+    }
+    *out = native_exp2(i);
+}
+
+void testLog2(const float *in, float *out) {
+    *out = fast_log2(*in);
+}
+
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/Android.mk b/tests/RenderScriptTests/RSTest_CompatLib/Android.mk
index e79c780..0fd0d96 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/Android.mk
+++ b/tests/RenderScriptTests/RSTest_CompatLib/Android.mk
@@ -29,6 +29,11 @@
 LOCAL_RENDERSCRIPT_TARGET_API := 18
 LOCAL_RENDERSCRIPT_COMPATIBILITY := 18
 
+LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC)
+LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE := \
+    $(TOPDIR)external/clang/lib/Headers \
+    $(TOPDIR)frameworks/rs/scriptc
+
 LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=android.support.v8.renderscript
 LOCAL_REQUIRED_MODULES := librsjni
 
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml b/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
index f45b555..53219e7 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
+++ b/tests/RenderScriptTests/RSTest_CompatLib/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.rs.test">
+    package="com.android.rs.test_compat">
   <uses-sdk android:minSdkVersion="8" />
   <uses-sdk android:targetSdkVersion="8" />
     <application
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java
index c667122..b76f21e 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.support.v8.renderscript.RenderScript;
 
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java
index 6b3df32..51f8a4d 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/RSTestCore.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java
index 92362b8..ddc6a99 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_alloc.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java
index 7be30a5..751187b 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_alloc.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java
index 9c4b420..f8b2fd3 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_array_init.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java
index 9f94b7f..7fe4b36 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_atomic.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java
index 18389ed..5da5288 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_bug_char.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java
index e8b865a..1f28abc 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java
index 738b121..d880e68 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_clamp_relaxed.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java
index aca656b..3085032 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_constant.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java
index bc2797d..a7cb226 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java
index 5f3ffb7..269bcef 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_convert_relaxed.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java
index e94a877..f435dde 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_copy_test.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java
index 8176903..abfa44c 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_element.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java
index c518a00..c3f3ca0 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java
index 7ba10de..653ebd5 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_foreach_bounds.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java
index 279b881..960df24 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_fp_mad.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java
index ae1eb0f..9592798 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_int4.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java
index 6830fda..ec67665 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java
index 5945bac..07538ec 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_kernel_struct.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java
index a696ac4..055c454 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java
index 14a5fa0..a7e7429 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_agree.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java
index dc58088..384cd13 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_math_conformance.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java
index 57fa515..cea9fe5 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_min.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java
index 0f897c8..69fc97f 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_noroot.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java
index e0ebc1b..3c663a8 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_primitives.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java
index d61a7a0..e6317d5 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_refcount.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java
index 4a2e295..740180e 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rsdebug.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java
index b6b9447..86e35a8 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstime.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java
index 2c13734..3245eca 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_rstypes.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java
index 61f4aad..d8d5a78 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_sampler.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java
index 053112f..43bbaf7 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_struct.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java
index adb1710..0e16240 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_unsigned.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java
index 47b7a6a..6ba822e 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UT_vector.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java
index a95584f..01abf2f 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/UnitTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.rs.test;
+package com.android.rs.test_compat;
 import android.content.Context;
 import android.util.Log;
 import android.support.v8.renderscript.RenderScript.RSMessageHandler;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs
new file mode 100644
index 0000000..650243e
--- /dev/null
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/rslist.rs
@@ -0,0 +1,25 @@
+// Copyright (C) 2013 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.
+
+#pragma version(1)
+
+#pragma rs java_package_name(com.android.rs.test_compat)
+
+typedef struct ListAllocs_s {
+    rs_allocation text;
+    int result;
+} ListAllocs;
+
+ListAllocs *gList;
+
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh
index 3adc999..b05a354 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/shared.rsh
@@ -1,6 +1,6 @@
 #pragma version(1)
 
-#pragma rs java_package_name(com.android.rs.test)
+#pragma rs java_package_name(com.android.rs.test_compat)
 
 typedef struct TestResult_s {
     rs_allocation name;
diff --git a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs
index 6dc83ba..89e7de7 100644
--- a/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs
+++ b/tests/RenderScriptTests/RSTest_CompatLib/src/com/android/rs/test/test_root.rs
@@ -1,7 +1,7 @@
 // Fountain test script
 #pragma version(1)
 
-#pragma rs java_package_name(com.android.rs.test)
+#pragma rs java_package_name(com.android.rs.test_compat)
 
 #pragma stateFragment(parent)
 
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index f012bcb..9f116fc 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -487,4 +487,10 @@
         // TODO Auto-generated method stub
         return null;
     }
+
+    @Override
+    public boolean isRotationFrozen() throws RemoteException {
+        // TODO Auto-generated method stub
+        return false;
+    }
 }
diff --git a/voip/java/android/net/rtp/AudioCodec.java b/voip/java/android/net/rtp/AudioCodec.java
deleted file mode 100644
index 85255c8..0000000
--- a/voip/java/android/net/rtp/AudioCodec.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.rtp;
-
-import java.util.Arrays;
-
-/**
- * This class defines a collection of audio codecs to be used with
- * {@link AudioStream}s. Their parameters are designed to be exchanged using
- * Session Description Protocol (SDP). Most of the values listed here can be
- * found in RFC 3551, while others are described in separated standards.
- *
- * <p>Few simple configurations are defined as public static instances for the
- * convenience of direct uses. More complicated ones could be obtained using
- * {@link #getCodec(int, String, String)}. For example, one can use the
- * following snippet to create a mode-1-only AMR codec.</p>
- * <pre>
- * AudioCodec codec = AudioCodec.getCodec(100, "AMR/8000", "mode-set=1");
- * </pre>
- *
- * @see AudioStream
- */
-public class AudioCodec {
-    /**
-     * The RTP payload type of the encoding.
-     */
-    public final int type;
-
-    /**
-     * The encoding parameters to be used in the corresponding SDP attribute.
-     */
-    public final String rtpmap;
-
-    /**
-     * The format parameters to be used in the corresponding SDP attribute.
-     */
-    public final String fmtp;
-
-    /**
-     * G.711 u-law audio codec.
-     */
-    public static final AudioCodec PCMU = new AudioCodec(0, "PCMU/8000", null);
-
-    /**
-     * G.711 a-law audio codec.
-     */
-    public static final AudioCodec PCMA = new AudioCodec(8, "PCMA/8000", null);
-
-    /**
-     * GSM Full-Rate audio codec, also known as GSM-FR, GSM 06.10, GSM, or
-     * simply FR.
-     */
-    public static final AudioCodec GSM = new AudioCodec(3, "GSM/8000", null);
-
-    /**
-     * GSM Enhanced Full-Rate audio codec, also known as GSM-EFR, GSM 06.60, or
-     * simply EFR.
-     */
-    public static final AudioCodec GSM_EFR = new AudioCodec(96, "GSM-EFR/8000", null);
-
-    /**
-     * Adaptive Multi-Rate narrowband audio codec, also known as AMR or AMR-NB.
-     * Currently CRC, robust sorting, and interleaving are not supported. See
-     * more details about these features in RFC 4867.
-     */
-    public static final AudioCodec AMR = new AudioCodec(97, "AMR/8000", null);
-
-    private static final AudioCodec[] sCodecs = {GSM_EFR, AMR, GSM, PCMU, PCMA};
-
-    private AudioCodec(int type, String rtpmap, String fmtp) {
-        this.type = type;
-        this.rtpmap = rtpmap;
-        this.fmtp = fmtp;
-    }
-
-    /**
-     * Returns system supported audio codecs.
-     */
-    public static AudioCodec[] getCodecs() {
-        return Arrays.copyOf(sCodecs, sCodecs.length);
-    }
-
-    /**
-     * Creates an AudioCodec according to the given configuration.
-     *
-     * @param type The payload type of the encoding defined in RTP/AVP.
-     * @param rtpmap The encoding parameters specified in the corresponding SDP
-     *     attribute, or null if it is not available.
-     * @param fmtp The format parameters specified in the corresponding SDP
-     *     attribute, or null if it is not available.
-     * @return The configured AudioCodec or {@code null} if it is not supported.
-     */
-    public static AudioCodec getCodec(int type, String rtpmap, String fmtp) {
-        if (type < 0 || type > 127) {
-            return null;
-        }
-
-        AudioCodec hint = null;
-        if (rtpmap != null) {
-            String clue = rtpmap.trim().toUpperCase();
-            for (AudioCodec codec : sCodecs) {
-                if (clue.startsWith(codec.rtpmap)) {
-                    String channels = clue.substring(codec.rtpmap.length());
-                    if (channels.length() == 0 || channels.equals("/1")) {
-                        hint = codec;
-                    }
-                    break;
-                }
-            }
-        } else if (type < 96) {
-            for (AudioCodec codec : sCodecs) {
-                if (type == codec.type) {
-                    hint = codec;
-                    rtpmap = codec.rtpmap;
-                    break;
-                }
-            }
-        }
-
-        if (hint == null) {
-            return null;
-        }
-        if (hint == AMR && fmtp != null) {
-            String clue = fmtp.toLowerCase();
-            if (clue.contains("crc=1") || clue.contains("robust-sorting=1") ||
-                    clue.contains("interleaving=")) {
-                return null;
-            }
-        }
-        return new AudioCodec(type, rtpmap, fmtp);
-    }
-}
diff --git a/voip/java/android/net/rtp/AudioGroup.java b/voip/java/android/net/rtp/AudioGroup.java
deleted file mode 100644
index 8faeb88..0000000
--- a/voip/java/android/net/rtp/AudioGroup.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.rtp;
-
-import android.media.AudioManager;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * An AudioGroup is an audio hub for the speaker, the microphone, and
- * {@link AudioStream}s. Each of these components can be logically turned on
- * or off by calling {@link #setMode(int)} or {@link RtpStream#setMode(int)}.
- * The AudioGroup will go through these components and process them one by one
- * within its execution loop. The loop consists of four steps. First, for each
- * AudioStream not in {@link RtpStream#MODE_SEND_ONLY}, decodes its incoming
- * packets and stores in its buffer. Then, if the microphone is enabled,
- * processes the recorded audio and stores in its buffer. Third, if the speaker
- * is enabled, mixes all AudioStream buffers and plays back. Finally, for each
- * AudioStream not in {@link RtpStream#MODE_RECEIVE_ONLY}, mixes all other
- * buffers and sends back the encoded packets. An AudioGroup does nothing if
- * there is no AudioStream in it.
- *
- * <p>Few things must be noticed before using these classes. The performance is
- * highly related to the system load and the network bandwidth. Usually a
- * simpler {@link AudioCodec} costs fewer CPU cycles but requires more network
- * bandwidth, and vise versa. Using two AudioStreams at the same time doubles
- * not only the load but also the bandwidth. The condition varies from one
- * device to another, and developers should choose the right combination in
- * order to get the best result.</p>
- *
- * <p>It is sometimes useful to keep multiple AudioGroups at the same time. For
- * example, a Voice over IP (VoIP) application might want to put a conference
- * call on hold in order to make a new call but still allow people in the
- * conference call talking to each other. This can be done easily using two
- * AudioGroups, but there are some limitations. Since the speaker and the
- * microphone are globally shared resources, only one AudioGroup at a time is
- * allowed to run in a mode other than {@link #MODE_ON_HOLD}. The others will
- * be unable to acquire these resources and fail silently.</p>
- *
- * <p class="note">Using this class requires
- * {@link android.Manifest.permission#RECORD_AUDIO} permission. Developers
- * should set the audio mode to {@link AudioManager#MODE_IN_COMMUNICATION}
- * using {@link AudioManager#setMode(int)} and change it back when none of
- * the AudioGroups is in use.</p>
- *
- * @see AudioStream
- */
-public class AudioGroup {
-    /**
-     * This mode is similar to {@link #MODE_NORMAL} except the speaker and
-     * the microphone are both disabled.
-     */
-    public static final int MODE_ON_HOLD = 0;
-
-    /**
-     * This mode is similar to {@link #MODE_NORMAL} except the microphone is
-     * disabled.
-     */
-    public static final int MODE_MUTED = 1;
-
-    /**
-     * This mode indicates that the speaker, the microphone, and all
-     * {@link AudioStream}s in the group are enabled. First, the packets
-     * received from the streams are decoded and mixed with the audio recorded
-     * from the microphone. Then, the results are played back to the speaker,
-     * encoded and sent back to each stream.
-     */
-    public static final int MODE_NORMAL = 2;
-
-    /**
-     * This mode is similar to {@link #MODE_NORMAL} except the echo suppression
-     * is enabled. It should be only used when the speaker phone is on.
-     */
-    public static final int MODE_ECHO_SUPPRESSION = 3;
-
-    private static final int MODE_LAST = 3;
-
-    private final Map<AudioStream, Integer> mStreams;
-    private int mMode = MODE_ON_HOLD;
-
-    private int mNative;
-    static {
-        System.loadLibrary("rtp_jni");
-    }
-
-    /**
-     * Creates an empty AudioGroup.
-     */
-    public AudioGroup() {
-        mStreams = new HashMap<AudioStream, Integer>();
-    }
-
-    /**
-     * Returns the {@link AudioStream}s in this group.
-     */
-    public AudioStream[] getStreams() {
-        synchronized (this) {
-            return mStreams.keySet().toArray(new AudioStream[mStreams.size()]);
-        }
-    }
-
-    /**
-     * Returns the current mode.
-     */
-    public int getMode() {
-        return mMode;
-    }
-
-    /**
-     * Changes the current mode. It must be one of {@link #MODE_ON_HOLD},
-     * {@link #MODE_MUTED}, {@link #MODE_NORMAL}, and
-     * {@link #MODE_ECHO_SUPPRESSION}.
-     *
-     * @param mode The mode to change to.
-     * @throws IllegalArgumentException if the mode is invalid.
-     */
-    public void setMode(int mode) {
-        if (mode < 0 || mode > MODE_LAST) {
-            throw new IllegalArgumentException("Invalid mode");
-        }
-        synchronized (this) {
-            nativeSetMode(mode);
-            mMode = mode;
-        }
-    }
-
-    private native void nativeSetMode(int mode);
-
-    // Package-private method used by AudioStream.join().
-    synchronized void add(AudioStream stream) {
-        if (!mStreams.containsKey(stream)) {
-            try {
-                AudioCodec codec = stream.getCodec();
-                String codecSpec = String.format(Locale.US, "%d %s %s", codec.type,
-                        codec.rtpmap, codec.fmtp);
-                int id = nativeAdd(stream.getMode(), stream.getSocket(),
-                        stream.getRemoteAddress().getHostAddress(),
-                        stream.getRemotePort(), codecSpec, stream.getDtmfType());
-                mStreams.put(stream, id);
-            } catch (NullPointerException e) {
-                throw new IllegalStateException(e);
-            }
-        }
-    }
-
-    private native int nativeAdd(int mode, int socket, String remoteAddress,
-            int remotePort, String codecSpec, int dtmfType);
-
-    // Package-private method used by AudioStream.join().
-    synchronized void remove(AudioStream stream) {
-        Integer id = mStreams.remove(stream);
-        if (id != null) {
-            nativeRemove(id);
-        }
-    }
-
-    private native void nativeRemove(int id);
-
-    /**
-     * Sends a DTMF digit to every {@link AudioStream} in this group. Currently
-     * only event {@code 0} to {@code 15} are supported.
-     *
-     * @throws IllegalArgumentException if the event is invalid.
-     */
-    public void sendDtmf(int event) {
-        if (event < 0 || event > 15) {
-            throw new IllegalArgumentException("Invalid event");
-        }
-        synchronized (this) {
-            nativeSendDtmf(event);
-        }
-    }
-
-    private native void nativeSendDtmf(int event);
-
-    /**
-     * Removes every {@link AudioStream} in this group.
-     */
-    public void clear() {
-        for (AudioStream stream : getStreams()) {
-            stream.join(null);
-        }
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        nativeRemove(0);
-        super.finalize();
-    }
-}
diff --git a/voip/java/android/net/rtp/AudioStream.java b/voip/java/android/net/rtp/AudioStream.java
deleted file mode 100644
index 5cd1abc..0000000
--- a/voip/java/android/net/rtp/AudioStream.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.rtp;
-
-import java.net.InetAddress;
-import java.net.SocketException;
-
-/**
- * An AudioStream is a {@link RtpStream} which carrys audio payloads over
- * Real-time Transport Protocol (RTP). Two different classes are developed in
- * order to support various usages such as audio conferencing. An AudioStream
- * represents a remote endpoint which consists of a network mapping and a
- * configured {@link AudioCodec}. On the other side, An {@link AudioGroup}
- * represents a local endpoint which mixes all the AudioStreams and optionally
- * interacts with the speaker and the microphone at the same time. The simplest
- * usage includes one for each endpoints. For other combinations, developers
- * should be aware of the limitations described in {@link AudioGroup}.
- *
- * <p>An AudioStream becomes busy when it joins an AudioGroup. In this case most
- * of the setter methods are disabled. This is designed to ease the task of
- * managing native resources. One can always make an AudioStream leave its
- * AudioGroup by calling {@link #join(AudioGroup)} with {@code null} and put it
- * back after the modification is done.</p>
- *
- * <p class="note">Using this class requires
- * {@link android.Manifest.permission#INTERNET} permission.</p>
- *
- * @see RtpStream
- * @see AudioGroup
- */
-public class AudioStream extends RtpStream {
-    private AudioCodec mCodec;
-    private int mDtmfType = -1;
-    private AudioGroup mGroup;
-
-    /**
-     * Creates an AudioStream on the given local address. Note that the local
-     * port is assigned automatically to conform with RFC 3550.
-     *
-     * @param address The network address of the local host to bind to.
-     * @throws SocketException if the address cannot be bound or a problem
-     *     occurs during binding.
-     */
-    public AudioStream(InetAddress address) throws SocketException {
-        super(address);
-    }
-
-    /**
-     * Returns {@code true} if the stream has already joined an
-     * {@link AudioGroup}.
-     */
-    @Override
-    public final boolean isBusy() {
-        return mGroup != null;
-    }
-
-    /**
-     * Returns the joined {@link AudioGroup}.
-     */
-    public AudioGroup getGroup() {
-        return mGroup;
-    }
-
-    /**
-     * Joins an {@link AudioGroup}. Each stream can join only one group at a
-     * time. The group can be changed by passing a different one or removed
-     * by calling this method with {@code null}.
-     *
-     * @param group The AudioGroup to join or {@code null} to leave.
-     * @throws IllegalStateException if the stream is not properly configured.
-     * @see AudioGroup
-     */
-    public void join(AudioGroup group) {
-        synchronized (this) {
-            if (mGroup == group) {
-                return;
-            }
-            if (mGroup != null) {
-                mGroup.remove(this);
-                mGroup = null;
-            }
-            if (group != null) {
-                group.add(this);
-                mGroup = group;
-            }
-        }
-    }
-
-    /**
-     * Returns the {@link AudioCodec}, or {@code null} if it is not set.
-     *
-     * @see #setCodec(AudioCodec)
-     */
-    public AudioCodec getCodec() {
-        return mCodec;
-    }
-
-    /**
-     * Sets the {@link AudioCodec}.
-     *
-     * @param codec The AudioCodec to be used.
-     * @throws IllegalArgumentException if its type is used by DTMF.
-     * @throws IllegalStateException if the stream is busy.
-     */
-    public void setCodec(AudioCodec codec) {
-        if (isBusy()) {
-            throw new IllegalStateException("Busy");
-        }
-        if (codec.type == mDtmfType) {
-            throw new IllegalArgumentException("The type is used by DTMF");
-        }
-        mCodec = codec;
-    }
-
-    /**
-     * Returns the RTP payload type for dual-tone multi-frequency (DTMF) digits,
-     * or {@code -1} if it is not enabled.
-     *
-     * @see #setDtmfType(int)
-     */
-    public int getDtmfType() {
-        return mDtmfType;
-    }
-
-    /**
-     * Sets the RTP payload type for dual-tone multi-frequency (DTMF) digits.
-     * The primary usage is to send digits to the remote gateway to perform
-     * certain tasks, such as second-stage dialing. According to RFC 2833, the
-     * RTP payload type for DTMF is assigned dynamically, so it must be in the
-     * range of 96 and 127. One can use {@code -1} to disable DTMF and free up
-     * the previous assigned type. This method cannot be called when the stream
-     * already joined an {@link AudioGroup}.
-     *
-     * @param type The RTP payload type to be used or {@code -1} to disable it.
-     * @throws IllegalArgumentException if the type is invalid or used by codec.
-     * @throws IllegalStateException if the stream is busy.
-     * @see AudioGroup#sendDtmf(int)
-     */
-    public void setDtmfType(int type) {
-        if (isBusy()) {
-            throw new IllegalStateException("Busy");
-        }
-        if (type != -1) {
-            if (type < 96 || type > 127) {
-                throw new IllegalArgumentException("Invalid type");
-            }
-            if (mCodec != null && type == mCodec.type) {
-                throw new IllegalArgumentException("The type is used by codec");
-            }
-        }
-        mDtmfType = type;
-    }
-}
diff --git a/voip/java/android/net/rtp/RtpStream.java b/voip/java/android/net/rtp/RtpStream.java
deleted file mode 100644
index b9d75cd..0000000
--- a/voip/java/android/net/rtp/RtpStream.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.rtp;
-
-import java.net.InetAddress;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.SocketException;
-
-/**
- * RtpStream represents the base class of streams which send and receive network
- * packets with media payloads over Real-time Transport Protocol (RTP).
- *
- * <p class="note">Using this class requires
- * {@link android.Manifest.permission#INTERNET} permission.</p>
- */
-public class RtpStream {
-    /**
-     * This mode indicates that the stream sends and receives packets at the
-     * same time. This is the initial mode for new streams.
-     */
-    public static final int MODE_NORMAL = 0;
-
-    /**
-     * This mode indicates that the stream only sends packets.
-     */
-    public static final int MODE_SEND_ONLY = 1;
-
-    /**
-     * This mode indicates that the stream only receives packets.
-     */
-    public static final int MODE_RECEIVE_ONLY = 2;
-
-    private static final int MODE_LAST = 2;
-
-    private final InetAddress mLocalAddress;
-    private final int mLocalPort;
-
-    private InetAddress mRemoteAddress;
-    private int mRemotePort = -1;
-    private int mMode = MODE_NORMAL;
-
-    private int mSocket = -1;
-    static {
-        System.loadLibrary("rtp_jni");
-    }
-
-    /**
-     * Creates a RtpStream on the given local address. Note that the local
-     * port is assigned automatically to conform with RFC 3550.
-     *
-     * @param address The network address of the local host to bind to.
-     * @throws SocketException if the address cannot be bound or a problem
-     *     occurs during binding.
-     */
-    RtpStream(InetAddress address) throws SocketException {
-        mLocalPort = create(address.getHostAddress());
-        mLocalAddress = address;
-    }
-
-    private native int create(String address) throws SocketException;
-
-    /**
-     * Returns the network address of the local host.
-     */
-    public InetAddress getLocalAddress() {
-        return mLocalAddress;
-    }
-
-    /**
-     * Returns the network port of the local host.
-     */
-    public int getLocalPort() {
-        return mLocalPort;
-    }
-
-    /**
-     * Returns the network address of the remote host or {@code null} if the
-     * stream is not associated.
-     */
-    public InetAddress getRemoteAddress() {
-        return mRemoteAddress;
-    }
-
-    /**
-     * Returns the network port of the remote host or {@code -1} if the stream
-     * is not associated.
-     */
-    public int getRemotePort() {
-        return mRemotePort;
-    }
-
-    /**
-     * Returns {@code true} if the stream is busy. In this case most of the
-     * setter methods are disabled. This method is intended to be overridden
-     * by subclasses.
-     */
-    public boolean isBusy() {
-        return false;
-    }
-
-    /**
-     * Returns the current mode.
-     */
-    public int getMode() {
-        return mMode;
-    }
-
-    /**
-     * Changes the current mode. It must be one of {@link #MODE_NORMAL},
-     * {@link #MODE_SEND_ONLY}, and {@link #MODE_RECEIVE_ONLY}.
-     *
-     * @param mode The mode to change to.
-     * @throws IllegalArgumentException if the mode is invalid.
-     * @throws IllegalStateException if the stream is busy.
-     * @see #isBusy()
-     */
-    public void setMode(int mode) {
-        if (isBusy()) {
-            throw new IllegalStateException("Busy");
-        }
-        if (mode < 0 || mode > MODE_LAST) {
-            throw new IllegalArgumentException("Invalid mode");
-        }
-        mMode = mode;
-    }
-
-    /**
-     * Associates with a remote host. This defines the destination of the
-     * outgoing packets.
-     *
-     * @param address The network address of the remote host.
-     * @param port The network port of the remote host.
-     * @throws IllegalArgumentException if the address is not supported or the
-     *     port is invalid.
-     * @throws IllegalStateException if the stream is busy.
-     * @see #isBusy()
-     */
-    public void associate(InetAddress address, int port) {
-        if (isBusy()) {
-            throw new IllegalStateException("Busy");
-        }
-        if (!(address instanceof Inet4Address && mLocalAddress instanceof Inet4Address) &&
-                !(address instanceof Inet6Address && mLocalAddress instanceof Inet6Address)) {
-            throw new IllegalArgumentException("Unsupported address");
-        }
-        if (port < 0 || port > 65535) {
-            throw new IllegalArgumentException("Invalid port");
-        }
-        mRemoteAddress = address;
-        mRemotePort = port;
-    }
-
-    int getSocket() {
-        return mSocket;
-    }
-
-    /**
-     * Releases allocated resources. The stream becomes inoperable after calling
-     * this method.
-     *
-     * @throws IllegalStateException if the stream is busy.
-     * @see #isBusy()
-     */
-    public void release() {
-        synchronized (this) {
-            if (isBusy()) {
-                throw new IllegalStateException("Busy");
-            }
-            close();
-        }
-    }
-
-    private native void close();
-
-    @Override
-    protected void finalize() throws Throwable {
-        close();
-        super.finalize();
-    }
-}
diff --git a/voip/java/android/net/rtp/package.html b/voip/java/android/net/rtp/package.html
deleted file mode 100644
index 4506b09..0000000
--- a/voip/java/android/net/rtp/package.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<html>
-<body>
-<p>Provides APIs for RTP (Real-time Transport Protocol), allowing applications to manage on-demand
-or interactive data streaming. In particular, apps that provide VOIP, push-to-talk, conferencing,
-and audio streaming can use these APIs to initiate sessions and transmit or receive data streams
-over any available network.</p>
-
-<p>To support audio conferencing and similar usages, you need to instantiate two classes as
-endpoints for the stream:</p>
-
-<ul>
-<li>{@link android.net.rtp.AudioStream} specifies a remote endpoint and consists of network mapping
-and a configured {@link android.net.rtp.AudioCodec}.</li>
-
-<li>{@link android.net.rtp.AudioGroup} represents the local endpoint for one or more {@link
-android.net.rtp.AudioStream}s. The {@link android.net.rtp.AudioGroup} mixes all the {@link
-android.net.rtp.AudioStream}s and optionally interacts with the device speaker and the microphone at
-the same time.</li>
-</ul>
-
-<p>The simplest usage involves a single remote endpoint and local endpoint. For more complex usages,
-refer to the limitations described for {@link android.net.rtp.AudioGroup}.</p>
-
-<p class="note"><strong>Note:</strong> To use the RTP APIs, you must request the {@link
-android.Manifest.permission#INTERNET} and {@link
-android.Manifest.permission#RECORD_AUDIO} permissions in your manifest file.</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/voip/java/android/net/sip/ISipService.aidl b/voip/java/android/net/sip/ISipService.aidl
deleted file mode 100644
index 3250bf9..0000000
--- a/voip/java/android/net/sip/ISipService.aidl
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.app.PendingIntent;
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipProfile;
-
-/**
- * {@hide}
- */
-interface ISipService {
-    void open(in SipProfile localProfile);
-    void open3(in SipProfile localProfile,
-            in PendingIntent incomingCallPendingIntent,
-            in ISipSessionListener listener);
-    void close(in String localProfileUri);
-    boolean isOpened(String localProfileUri);
-    boolean isRegistered(String localProfileUri);
-    void setRegistrationListener(String localProfileUri,
-            ISipSessionListener listener);
-
-    ISipSession createSession(in SipProfile localProfile,
-            in ISipSessionListener listener);
-    ISipSession getPendingSession(String callId);
-
-    SipProfile[] getListOfProfiles();
-}
diff --git a/voip/java/android/net/sip/ISipSession.aidl b/voip/java/android/net/sip/ISipSession.aidl
deleted file mode 100644
index 2d515db..0000000
--- a/voip/java/android/net/sip/ISipSession.aidl
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipProfile;
-
-/**
- * A SIP session that is associated with a SIP dialog or a transaction that is
- * not within a dialog.
- * @hide
- */
-interface ISipSession {
-    /**
-     * Gets the IP address of the local host on which this SIP session runs.
-     *
-     * @return the IP address of the local host
-     */
-    String getLocalIp();
-
-    /**
-     * Gets the SIP profile that this session is associated with.
-     *
-     * @return the SIP profile that this session is associated with
-     */
-    SipProfile getLocalProfile();
-
-    /**
-     * Gets the SIP profile that this session is connected to. Only available
-     * when the session is associated with a SIP dialog.
-     *
-     * @return the SIP profile that this session is connected to
-     */
-    SipProfile getPeerProfile();
-
-    /**
-     * Gets the session state. The value returned must be one of the states in
-     * {@link SipSessionState}.
-     *
-     * @return the session state
-     */
-    int getState();
-
-    /**
-     * Checks if the session is in a call.
-     *
-     * @return true if the session is in a call
-     */
-    boolean isInCall();
-
-    /**
-     * Gets the call ID of the session.
-     *
-     * @return the call ID
-     */
-    String getCallId();
-
-
-    /**
-     * Sets the listener to listen to the session events. A {@link ISipSession}
-     * can only hold one listener at a time. Subsequent calls to this method
-     * override the previous listener.
-     *
-     * @param listener to listen to the session events of this object
-     */
-    void setListener(in ISipSessionListener listener);
-
-
-    /**
-     * Performs registration to the server specified by the associated local
-     * profile. The session listener is called back upon success or failure of
-     * registration. The method is only valid to call when the session state is
-     * in {@link SipSessionState#READY_TO_CALL}.
-     *
-     * @param duration duration in second before the registration expires
-     * @see ISipSessionListener
-     */
-    void register(int duration);
-
-    /**
-     * Performs unregistration to the server specified by the associated local
-     * profile. Unregistration is technically the same as registration with zero
-     * expiration duration. The session listener is called back upon success or
-     * failure of unregistration. The method is only valid to call when the
-     * session state is in {@link SipSessionState#READY_TO_CALL}.
-     *
-     * @see ISipSessionListener
-     */
-    void unregister();
-
-    /**
-     * Initiates a call to the specified profile. The session listener is called
-     * back upon defined session events. The method is only valid to call when
-     * the session state is in {@link SipSessionState#READY_TO_CALL}.
-     *
-     * @param callee the SIP profile to make the call to
-     * @param sessionDescription the session description of this call
-     * @param timeout the session will be timed out if the call is not
-     *        established within {@code timeout} seconds
-     * @see ISipSessionListener
-     */
-    void makeCall(in SipProfile callee, String sessionDescription, int timeout);
-
-    /**
-     * Answers an incoming call with the specified session description. The
-     * method is only valid to call when the session state is in
-     * {@link SipSessionState#INCOMING_CALL}.
-     *
-     * @param sessionDescription the session description to answer this call
-     * @param timeout the session will be timed out if the call is not
-     *        established within {@code timeout} seconds
-     */
-    void answerCall(String sessionDescription, int timeout);
-
-    /**
-     * Ends an established call, terminates an outgoing call or rejects an
-     * incoming call. The method is only valid to call when the session state is
-     * in {@link SipSessionState#IN_CALL},
-     * {@link SipSessionState#INCOMING_CALL},
-     * {@link SipSessionState#OUTGOING_CALL} or
-     * {@link SipSessionState#OUTGOING_CALL_RING_BACK}.
-     */
-    void endCall();
-
-    /**
-     * Changes the session description during a call. The method is only valid
-     * to call when the session state is in {@link SipSessionState#IN_CALL}.
-     *
-     * @param sessionDescription the new session description
-     * @param timeout the session will be timed out if the call is not
-     *        established within {@code timeout} seconds
-     */
-    void changeCall(String sessionDescription, int timeout);
-}
diff --git a/voip/java/android/net/sip/ISipSessionListener.aidl b/voip/java/android/net/sip/ISipSessionListener.aidl
deleted file mode 100644
index 690700c..0000000
--- a/voip/java/android/net/sip/ISipSessionListener.aidl
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.net.sip.ISipSession;
-import android.net.sip.SipProfile;
-
-/**
- * Listener class to listen to SIP session events.
- * @hide
- */
-interface ISipSessionListener {
-    /**
-     * Called when an INVITE request is sent to initiate a new call.
-     *
-     * @param session the session object that carries out the transaction
-     */
-    void onCalling(in ISipSession session);
-
-    /**
-     * Called when an INVITE request is received.
-     *
-     * @param session the session object that carries out the transaction
-     * @param caller the SIP profile of the caller
-     * @param sessionDescription the caller's session description
-     */
-    void onRinging(in ISipSession session, in SipProfile caller,
-            String sessionDescription);
-
-    /**
-     * Called when a RINGING response is received for the INVITE request sent
-     *
-     * @param session the session object that carries out the transaction
-     */
-    void onRingingBack(in ISipSession session);
-
-    /**
-     * Called when the session is established.
-     *
-     * @param session the session object that is associated with the dialog
-     * @param sessionDescription the peer's session description
-     */
-    void onCallEstablished(in ISipSession session,
-            String sessionDescription);
-
-    /**
-     * Called when the session is terminated.
-     *
-     * @param session the session object that is associated with the dialog
-     */
-    void onCallEnded(in ISipSession session);
-
-    /**
-     * Called when the peer is busy during session initialization.
-     *
-     * @param session the session object that carries out the transaction
-     */
-    void onCallBusy(in ISipSession session);
-
-    /**
-     * Called when the call is being transferred to a new one.
-     *
-     * @param newSession the new session that the call will be transferred to
-     * @param sessionDescription the new peer's session description
-     */
-    void onCallTransferring(in ISipSession newSession, String sessionDescription);
-
-    /**
-     * Called when an error occurs during session initialization and
-     * termination.
-     *
-     * @param session the session object that carries out the transaction
-     * @param errorCode error code defined in {@link SipErrorCode}
-     * @param errorMessage error message
-     */
-    void onError(in ISipSession session, int errorCode, String errorMessage);
-
-    /**
-     * Called when an error occurs during session modification negotiation.
-     *
-     * @param session the session object that carries out the transaction
-     * @param errorCode error code defined in {@link SipErrorCode}
-     * @param errorMessage error message
-     */
-    void onCallChangeFailed(in ISipSession session, int errorCode,
-            String errorMessage);
-
-    /**
-     * Called when a registration request is sent.
-     *
-     * @param session the session object that carries out the transaction
-     */
-    void onRegistering(in ISipSession session);
-
-    /**
-     * Called when registration is successfully done.
-     *
-     * @param session the session object that carries out the transaction
-     * @param duration duration in second before the registration expires
-     */
-    void onRegistrationDone(in ISipSession session, int duration);
-
-    /**
-     * Called when the registration fails.
-     *
-     * @param session the session object that carries out the transaction
-     * @param errorCode error code defined in {@link SipErrorCode}
-     * @param errorMessage error message
-     */
-    void onRegistrationFailed(in ISipSession session, int errorCode,
-            String errorMessage);
-
-    /**
-     * Called when the registration gets timed out.
-     *
-     * @param session the session object that carries out the transaction
-     */
-    void onRegistrationTimeout(in ISipSession session);
-}
diff --git a/voip/java/android/net/sip/SimpleSessionDescription.java b/voip/java/android/net/sip/SimpleSessionDescription.java
deleted file mode 100644
index 9fcd21d..0000000
--- a/voip/java/android/net/sip/SimpleSessionDescription.java
+++ /dev/null
@@ -1,613 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Locale;
-
-/**
- * An object used to manipulate messages of Session Description Protocol (SDP).
- * It is mainly designed for the uses of Session Initiation Protocol (SIP).
- * Therefore, it only handles connection addresses ("c="), bandwidth limits,
- * ("b="), encryption keys ("k="), and attribute fields ("a="). Currently this
- * implementation does not support multicast sessions.
- *
- * <p>Here is an example code to create a session description.</p>
- * <pre>
- * SimpleSessionDescription description = new SimpleSessionDescription(
- *     System.currentTimeMillis(), "1.2.3.4");
- * Media media = description.newMedia("audio", 56789, 1, "RTP/AVP");
- * media.setRtpPayload(0, "PCMU/8000", null);
- * media.setRtpPayload(8, "PCMA/8000", null);
- * media.setRtpPayload(127, "telephone-event/8000", "0-15");
- * media.setAttribute("sendrecv", "");
- * </pre>
- * <p>Invoking <code>description.encode()</code> will produce a result like the
- * one below.</p>
- * <pre>
- * v=0
- * o=- 1284970442706 1284970442709 IN IP4 1.2.3.4
- * s=-
- * c=IN IP4 1.2.3.4
- * t=0 0
- * m=audio 56789 RTP/AVP 0 8 127
- * a=rtpmap:0 PCMU/8000
- * a=rtpmap:8 PCMA/8000
- * a=rtpmap:127 telephone-event/8000
- * a=fmtp:127 0-15
- * a=sendrecv
- * </pre>
- * @hide
- */
-public class SimpleSessionDescription {
-    private final Fields mFields = new Fields("voscbtka");
-    private final ArrayList<Media> mMedia = new ArrayList<Media>();
-
-    /**
-     * Creates a minimal session description from the given session ID and
-     * unicast address. The address is used in the origin field ("o=") and the
-     * connection field ("c="). See {@link SimpleSessionDescription} for an
-     * example of its usage.
-     */
-    public SimpleSessionDescription(long sessionId, String address) {
-        address = (address.indexOf(':') < 0 ? "IN IP4 " : "IN IP6 ") + address;
-        mFields.parse("v=0");
-        mFields.parse(String.format(Locale.US, "o=- %d %d %s", sessionId,
-                System.currentTimeMillis(), address));
-        mFields.parse("s=-");
-        mFields.parse("t=0 0");
-        mFields.parse("c=" + address);
-    }
-
-    /**
-     * Creates a session description from the given message.
-     *
-     * @throws IllegalArgumentException if message is invalid.
-     */
-    public SimpleSessionDescription(String message) {
-        String[] lines = message.trim().replaceAll(" +", " ").split("[\r\n]+");
-        Fields fields = mFields;
-
-        for (String line : lines) {
-            try {
-                if (line.charAt(1) != '=') {
-                    throw new IllegalArgumentException();
-                }
-                if (line.charAt(0) == 'm') {
-                    String[] parts = line.substring(2).split(" ", 4);
-                    String[] ports = parts[1].split("/", 2);
-                    Media media = newMedia(parts[0], Integer.parseInt(ports[0]),
-                            (ports.length < 2) ? 1 : Integer.parseInt(ports[1]),
-                            parts[2]);
-                    for (String format : parts[3].split(" ")) {
-                        media.setFormat(format, null);
-                    }
-                    fields = media;
-                } else {
-                    fields.parse(line);
-                }
-            } catch (Exception e) {
-                throw new IllegalArgumentException("Invalid SDP: " + line);
-            }
-        }
-    }
-
-    /**
-     * Creates a new media description in this session description.
-     *
-     * @param type The media type, e.g. {@code "audio"}.
-     * @param port The first transport port used by this media.
-     * @param portCount The number of contiguous ports used by this media.
-     * @param protocol The transport protocol, e.g. {@code "RTP/AVP"}.
-     */
-    public Media newMedia(String type, int port, int portCount,
-            String protocol) {
-        Media media = new Media(type, port, portCount, protocol);
-        mMedia.add(media);
-        return media;
-    }
-
-    /**
-     * Returns all the media descriptions in this session description.
-     */
-    public Media[] getMedia() {
-        return mMedia.toArray(new Media[mMedia.size()]);
-    }
-
-    /**
-     * Encodes the session description and all its media descriptions in a
-     * string. Note that the result might be incomplete if a required field
-     * has never been added before.
-     */
-    public String encode() {
-        StringBuilder buffer = new StringBuilder();
-        mFields.write(buffer);
-        for (Media media : mMedia) {
-            media.write(buffer);
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * Returns the connection address or {@code null} if it is not present.
-     */
-    public String getAddress() {
-        return mFields.getAddress();
-    }
-
-    /**
-     * Sets the connection address. The field will be removed if the address
-     * is {@code null}.
-     */
-    public void setAddress(String address) {
-        mFields.setAddress(address);
-    }
-
-    /**
-     * Returns the encryption method or {@code null} if it is not present.
-     */
-    public String getEncryptionMethod() {
-        return mFields.getEncryptionMethod();
-    }
-
-    /**
-     * Returns the encryption key or {@code null} if it is not present.
-     */
-    public String getEncryptionKey() {
-        return mFields.getEncryptionKey();
-    }
-
-    /**
-     * Sets the encryption method and the encryption key. The field will be
-     * removed if the method is {@code null}.
-     */
-    public void setEncryption(String method, String key) {
-        mFields.setEncryption(method, key);
-    }
-
-    /**
-     * Returns the types of the bandwidth limits.
-     */
-    public String[] getBandwidthTypes() {
-        return mFields.getBandwidthTypes();
-    }
-
-    /**
-     * Returns the bandwidth limit of the given type or {@code -1} if it is not
-     * present.
-     */
-    public int getBandwidth(String type) {
-        return mFields.getBandwidth(type);
-    }
-
-    /**
-     * Sets the bandwith limit for the given type. The field will be removed if
-     * the value is negative.
-     */
-    public void setBandwidth(String type, int value) {
-        mFields.setBandwidth(type, value);
-    }
-
-    /**
-     * Returns the names of all the attributes.
-     */
-    public String[] getAttributeNames() {
-        return mFields.getAttributeNames();
-    }
-
-    /**
-     * Returns the attribute of the given name or {@code null} if it is not
-     * present.
-     */
-    public String getAttribute(String name) {
-        return mFields.getAttribute(name);
-    }
-
-    /**
-     * Sets the attribute for the given name. The field will be removed if
-     * the value is {@code null}. To set a binary attribute, use an empty
-     * string as the value.
-     */
-    public void setAttribute(String name, String value) {
-        mFields.setAttribute(name, value);
-    }
-
-    /**
-     * This class represents a media description of a session description. It
-     * can only be created by {@link SimpleSessionDescription#newMedia}. Since
-     * the syntax is more restricted for RTP based protocols, two sets of access
-     * methods are implemented. See {@link SimpleSessionDescription} for an
-     * example of its usage.
-     */
-    public static class Media extends Fields {
-        private final String mType;
-        private final int mPort;
-        private final int mPortCount;
-        private final String mProtocol;
-        private ArrayList<String> mFormats = new ArrayList<String>();
-
-        private Media(String type, int port, int portCount, String protocol) {
-            super("icbka");
-            mType = type;
-            mPort = port;
-            mPortCount = portCount;
-            mProtocol = protocol;
-        }
-
-        /**
-         * Returns the media type.
-         */
-        public String getType() {
-            return mType;
-        }
-
-        /**
-         * Returns the first transport port used by this media.
-         */
-        public int getPort() {
-            return mPort;
-        }
-
-        /**
-         * Returns the number of contiguous ports used by this media.
-         */
-        public int getPortCount() {
-            return mPortCount;
-        }
-
-        /**
-         * Returns the transport protocol.
-         */
-        public String getProtocol() {
-            return mProtocol;
-        }
-
-        /**
-         * Returns the media formats.
-         */
-        public String[] getFormats() {
-            return mFormats.toArray(new String[mFormats.size()]);
-        }
-
-        /**
-         * Returns the {@code fmtp} attribute of the given format or
-         * {@code null} if it is not present.
-         */
-        public String getFmtp(String format) {
-            return super.get("a=fmtp:" + format, ' ');
-        }
-
-        /**
-         * Sets a format and its {@code fmtp} attribute. If the attribute is
-         * {@code null}, the corresponding field will be removed.
-         */
-        public void setFormat(String format, String fmtp) {
-            mFormats.remove(format);
-            mFormats.add(format);
-            super.set("a=rtpmap:" + format, ' ', null);
-            super.set("a=fmtp:" + format, ' ', fmtp);
-        }
-
-        /**
-         * Removes a format and its {@code fmtp} attribute.
-         */
-        public void removeFormat(String format) {
-            mFormats.remove(format);
-            super.set("a=rtpmap:" + format, ' ', null);
-            super.set("a=fmtp:" + format, ' ', null);
-        }
-
-        /**
-         * Returns the RTP payload types.
-         */
-        public int[] getRtpPayloadTypes() {
-            int[] types = new int[mFormats.size()];
-            int length = 0;
-            for (String format : mFormats) {
-                try {
-                    types[length] = Integer.parseInt(format);
-                    ++length;
-                } catch (NumberFormatException e) { }
-            }
-            return Arrays.copyOf(types, length);
-        }
-
-        /**
-         * Returns the {@code rtpmap} attribute of the given RTP payload type
-         * or {@code null} if it is not present.
-         */
-        public String getRtpmap(int type) {
-            return super.get("a=rtpmap:" + type, ' ');
-        }
-
-        /**
-         * Returns the {@code fmtp} attribute of the given RTP payload type or
-         * {@code null} if it is not present.
-         */
-        public String getFmtp(int type) {
-            return super.get("a=fmtp:" + type, ' ');
-        }
-
-        /**
-         * Sets a RTP payload type and its {@code rtpmap} and {@code fmtp}
-         * attributes. If any of the attributes is {@code null}, the
-         * corresponding field will be removed. See
-         * {@link SimpleSessionDescription} for an example of its usage.
-         */
-        public void setRtpPayload(int type, String rtpmap, String fmtp) {
-            String format = String.valueOf(type);
-            mFormats.remove(format);
-            mFormats.add(format);
-            super.set("a=rtpmap:" + format, ' ', rtpmap);
-            super.set("a=fmtp:" + format, ' ', fmtp);
-        }
-
-        /**
-         * Removes a RTP payload and its {@code rtpmap} and {@code fmtp}
-         * attributes.
-         */
-        public void removeRtpPayload(int type) {
-            removeFormat(String.valueOf(type));
-        }
-
-        private void write(StringBuilder buffer) {
-            buffer.append("m=").append(mType).append(' ').append(mPort);
-            if (mPortCount != 1) {
-                buffer.append('/').append(mPortCount);
-            }
-            buffer.append(' ').append(mProtocol);
-            for (String format : mFormats) {
-                buffer.append(' ').append(format);
-            }
-            buffer.append("\r\n");
-            super.write(buffer);
-        }
-    }
-
-    /**
-     * This class acts as a set of fields, and the size of the set is expected
-     * to be small. Therefore, it uses a simple list instead of maps. Each field
-     * has three parts: a key, a delimiter, and a value. Delimiters are special
-     * because they are not included in binary attributes. As a result, the
-     * private methods, which are the building blocks of this class, all take
-     * the delimiter as an argument.
-     */
-    private static class Fields {
-        private final String mOrder;
-        private final ArrayList<String> mLines = new ArrayList<String>();
-
-        Fields(String order) {
-            mOrder = order;
-        }
-
-        /**
-         * Returns the connection address or {@code null} if it is not present.
-         */
-        public String getAddress() {
-            String address = get("c", '=');
-            if (address == null) {
-                return null;
-            }
-            String[] parts = address.split(" ");
-            if (parts.length != 3) {
-                return null;
-            }
-            int slash = parts[2].indexOf('/');
-            return (slash < 0) ? parts[2] : parts[2].substring(0, slash);
-        }
-
-        /**
-         * Sets the connection address. The field will be removed if the address
-         * is {@code null}.
-         */
-        public void setAddress(String address) {
-            if (address != null) {
-                address = (address.indexOf(':') < 0 ? "IN IP4 " : "IN IP6 ") +
-                        address;
-            }
-            set("c", '=', address);
-        }
-
-        /**
-         * Returns the encryption method or {@code null} if it is not present.
-         */
-        public String getEncryptionMethod() {
-            String encryption = get("k", '=');
-            if (encryption == null) {
-                return null;
-            }
-            int colon = encryption.indexOf(':');
-            return (colon == -1) ? encryption : encryption.substring(0, colon);
-        }
-
-        /**
-         * Returns the encryption key or {@code null} if it is not present.
-         */
-        public String getEncryptionKey() {
-            String encryption = get("k", '=');
-            if (encryption == null) {
-                return null;
-            }
-            int colon = encryption.indexOf(':');
-            return (colon == -1) ? null : encryption.substring(0, colon + 1);
-        }
-
-        /**
-         * Sets the encryption method and the encryption key. The field will be
-         * removed if the method is {@code null}.
-         */
-        public void setEncryption(String method, String key) {
-            set("k", '=', (method == null || key == null) ?
-                    method : method + ':' + key);
-        }
-
-        /**
-         * Returns the types of the bandwidth limits.
-         */
-        public String[] getBandwidthTypes() {
-            return cut("b=", ':');
-        }
-
-        /**
-         * Returns the bandwidth limit of the given type or {@code -1} if it is
-         * not present.
-         */
-        public int getBandwidth(String type) {
-            String value = get("b=" + type, ':');
-            if (value != null) {
-                try {
-                    return Integer.parseInt(value);
-                } catch (NumberFormatException e) { }
-                setBandwidth(type, -1);
-            }
-            return -1;
-        }
-
-        /**
-         * Sets the bandwith limit for the given type. The field will be removed
-         * if the value is negative.
-         */
-        public void setBandwidth(String type, int value) {
-            set("b=" + type, ':', (value < 0) ? null : String.valueOf(value));
-        }
-
-        /**
-         * Returns the names of all the attributes.
-         */
-        public String[] getAttributeNames() {
-            return cut("a=", ':');
-        }
-
-        /**
-         * Returns the attribute of the given name or {@code null} if it is not
-         * present.
-         */
-        public String getAttribute(String name) {
-            return get("a=" + name, ':');
-        }
-
-        /**
-         * Sets the attribute for the given name. The field will be removed if
-         * the value is {@code null}. To set a binary attribute, use an empty
-         * string as the value.
-         */
-        public void setAttribute(String name, String value) {
-            set("a=" + name, ':', value);
-        }
-
-        private void write(StringBuilder buffer) {
-            for (int i = 0; i < mOrder.length(); ++i) {
-                char type = mOrder.charAt(i);
-                for (String line : mLines) {
-                    if (line.charAt(0) == type) {
-                        buffer.append(line).append("\r\n");
-                    }
-                }
-            }
-        }
-
-        /**
-         * Invokes {@link #set} after splitting the line into three parts.
-         */
-        private void parse(String line) {
-            char type = line.charAt(0);
-            if (mOrder.indexOf(type) == -1) {
-                return;
-            }
-            char delimiter = '=';
-            if (line.startsWith("a=rtpmap:") || line.startsWith("a=fmtp:")) {
-                delimiter = ' ';
-            } else if (type == 'b' || type == 'a') {
-                delimiter = ':';
-            }
-            int i = line.indexOf(delimiter);
-            if (i == -1) {
-                set(line, delimiter, "");
-            } else {
-                set(line.substring(0, i), delimiter, line.substring(i + 1));
-            }
-        }
-
-        /**
-         * Finds the key with the given prefix and returns its suffix.
-         */
-        private String[] cut(String prefix, char delimiter) {
-            String[] names = new String[mLines.size()];
-            int length = 0;
-            for (String line : mLines) {
-                if (line.startsWith(prefix)) {
-                    int i = line.indexOf(delimiter);
-                    if (i == -1) {
-                        i = line.length();
-                    }
-                    names[length] = line.substring(prefix.length(), i);
-                    ++length;
-                }
-            }
-            return Arrays.copyOf(names, length);
-        }
-
-        /**
-         * Returns the index of the key.
-         */
-        private int find(String key, char delimiter) {
-            int length = key.length();
-            for (int i = mLines.size() - 1; i >= 0; --i) {
-                String line = mLines.get(i);
-                if (line.startsWith(key) && (line.length() == length ||
-                        line.charAt(length) == delimiter)) {
-                    return i;
-                }
-            }
-            return -1;
-        }
-
-        /**
-         * Sets the key with the value or removes the key if the value is
-         * {@code null}.
-         */
-        private void set(String key, char delimiter, String value) {
-            int index = find(key, delimiter);
-            if (value != null) {
-                if (value.length() != 0) {
-                    key = key + delimiter + value;
-                }
-                if (index == -1) {
-                    mLines.add(key);
-                } else {
-                    mLines.set(index, key);
-                }
-            } else if (index != -1) {
-                mLines.remove(index);
-            }
-        }
-
-        /**
-         * Returns the value of the key.
-         */
-        private String get(String key, char delimiter) {
-            int index = find(key, delimiter);
-            if (index == -1) {
-                return null;
-            }
-            String line = mLines.get(index);
-            int length = key.length();
-            return (line.length() == length) ? "" : line.substring(length + 1);
-        }
-    }
-}
diff --git a/voip/java/android/net/sip/SipAudioCall.java b/voip/java/android/net/sip/SipAudioCall.java
deleted file mode 100644
index 1d67055..0000000
--- a/voip/java/android/net/sip/SipAudioCall.java
+++ /dev/null
@@ -1,1126 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.net.rtp.AudioCodec;
-import android.net.rtp.AudioGroup;
-import android.net.rtp.AudioStream;
-import android.net.rtp.RtpStream;
-import android.net.sip.SimpleSessionDescription.Media;
-import android.net.wifi.WifiManager;
-import android.os.Message;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Handles an Internet audio call over SIP. You can instantiate this class with {@link SipManager},
- * using {@link SipManager#makeAudioCall makeAudioCall()} and  {@link SipManager#takeAudioCall
- * takeAudioCall()}.
- *
- * <p class="note"><strong>Note:</strong> Using this class require the
- *   {@link android.Manifest.permission#INTERNET} and
- *   {@link android.Manifest.permission#USE_SIP} permissions. In addition, {@link
- *   #startAudio} requires the
- *   {@link android.Manifest.permission#RECORD_AUDIO},
- *   {@link android.Manifest.permission#ACCESS_WIFI_STATE}, and
- *   {@link android.Manifest.permission#WAKE_LOCK} permissions; and {@link #setSpeakerMode
- *   setSpeakerMode()} requires the
- *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS} permission.</p>
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about using SIP, read the
- * <a href="{@docRoot}guide/topics/network/sip.html">Session Initiation Protocol</a>
- * developer guide.</p>
- * </div>
- */
-public class SipAudioCall {
-    private static final String TAG = SipAudioCall.class.getSimpleName();
-    private static final boolean RELEASE_SOCKET = true;
-    private static final boolean DONT_RELEASE_SOCKET = false;
-    private static final int SESSION_TIMEOUT = 5; // in seconds
-    private static final int TRANSFER_TIMEOUT = 15; // in seconds
-
-    /** Listener for events relating to a SIP call, such as when a call is being
-     * recieved ("on ringing") or a call is outgoing ("on calling").
-     * <p>Many of these events are also received by {@link SipSession.Listener}.</p>
-     */
-    public static class Listener {
-        /**
-         * Called when the call object is ready to make another call.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that is ready to make another call
-         */
-        public void onReadyToCall(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when a request is sent out to initiate a new call.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         */
-        public void onCalling(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when a new call comes in.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         * @param caller the SIP profile of the caller
-         */
-        public void onRinging(SipAudioCall call, SipProfile caller) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when a RINGING response is received for the INVITE request
-         * sent. The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         */
-        public void onRingingBack(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when the session is established.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         */
-        public void onCallEstablished(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when the session is terminated.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         */
-        public void onCallEnded(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when the peer is busy during session initialization.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         */
-        public void onCallBusy(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when the call is on hold.
-         * The default implementation calls {@link #onChanged}.
-         *
-         * @param call the call object that carries out the audio call
-         */
-        public void onCallHeld(SipAudioCall call) {
-            onChanged(call);
-        }
-
-        /**
-         * Called when an error occurs. The default implementation is no op.
-         *
-         * @param call the call object that carries out the audio call
-         * @param errorCode error code of this error
-         * @param errorMessage error message
-         * @see SipErrorCode
-         */
-        public void onError(SipAudioCall call, int errorCode,
-                String errorMessage) {
-            // no-op
-        }
-
-        /**
-         * Called when an event occurs and the corresponding callback is not
-         * overridden. The default implementation is no op. Error events are
-         * not re-directed to this callback and are handled in {@link #onError}.
-         */
-        public void onChanged(SipAudioCall call) {
-            // no-op
-        }
-    }
-
-    private Context mContext;
-    private SipProfile mLocalProfile;
-    private SipAudioCall.Listener mListener;
-    private SipSession mSipSession;
-    private SipSession mTransferringSession;
-
-    private long mSessionId = System.currentTimeMillis();
-    private String mPeerSd;
-
-    private AudioStream mAudioStream;
-    private AudioGroup mAudioGroup;
-
-    private boolean mInCall = false;
-    private boolean mMuted = false;
-    private boolean mHold = false;
-
-    private SipProfile mPendingCallRequest;
-    private WifiManager mWm;
-    private WifiManager.WifiLock mWifiHighPerfLock;
-
-    private int mErrorCode = SipErrorCode.NO_ERROR;
-    private String mErrorMessage;
-
-    /**
-     * Creates a call object with the local SIP profile.
-     * @param context the context for accessing system services such as
-     *        ringtone, audio, WIFI etc
-     */
-    public SipAudioCall(Context context, SipProfile localProfile) {
-        mContext = context;
-        mLocalProfile = localProfile;
-        mWm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
-    }
-
-    /**
-     * Sets the listener to listen to the audio call events. The method calls
-     * {@link #setListener setListener(listener, false)}.
-     *
-     * @param listener to listen to the audio call events of this object
-     * @see #setListener(Listener, boolean)
-     */
-    public void setListener(SipAudioCall.Listener listener) {
-        setListener(listener, false);
-    }
-
-    /**
-     * Sets the listener to listen to the audio call events. A
-     * {@link SipAudioCall} can only hold one listener at a time. Subsequent
-     * calls to this method override the previous listener.
-     *
-     * @param listener to listen to the audio call events of this object
-     * @param callbackImmediately set to true if the caller wants to be called
-     *      back immediately on the current state
-     */
-    public void setListener(SipAudioCall.Listener listener,
-            boolean callbackImmediately) {
-        mListener = listener;
-        try {
-            if ((listener == null) || !callbackImmediately) {
-                // do nothing
-            } else if (mErrorCode != SipErrorCode.NO_ERROR) {
-                listener.onError(this, mErrorCode, mErrorMessage);
-            } else if (mInCall) {
-                if (mHold) {
-                    listener.onCallHeld(this);
-                } else {
-                    listener.onCallEstablished(this);
-                }
-            } else {
-                int state = getState();
-                switch (state) {
-                    case SipSession.State.READY_TO_CALL:
-                        listener.onReadyToCall(this);
-                        break;
-                    case SipSession.State.INCOMING_CALL:
-                        listener.onRinging(this, getPeerProfile());
-                        break;
-                    case SipSession.State.OUTGOING_CALL:
-                        listener.onCalling(this);
-                        break;
-                    case SipSession.State.OUTGOING_CALL_RING_BACK:
-                        listener.onRingingBack(this);
-                        break;
-                }
-            }
-        } catch (Throwable t) {
-            Log.e(TAG, "setListener()", t);
-        }
-    }
-
-    /**
-     * Checks if the call is established.
-     *
-     * @return true if the call is established
-     */
-    public boolean isInCall() {
-        synchronized (this) {
-            return mInCall;
-        }
-    }
-
-    /**
-     * Checks if the call is on hold.
-     *
-     * @return true if the call is on hold
-     */
-    public boolean isOnHold() {
-        synchronized (this) {
-            return mHold;
-        }
-    }
-
-    /**
-     * Closes this object. This object is not usable after being closed.
-     */
-    public void close() {
-        close(true);
-    }
-
-    private synchronized void close(boolean closeRtp) {
-        if (closeRtp) stopCall(RELEASE_SOCKET);
-
-        mInCall = false;
-        mHold = false;
-        mSessionId = System.currentTimeMillis();
-        mErrorCode = SipErrorCode.NO_ERROR;
-        mErrorMessage = null;
-
-        if (mSipSession != null) {
-            mSipSession.setListener(null);
-            mSipSession = null;
-        }
-    }
-
-    /**
-     * Gets the local SIP profile.
-     *
-     * @return the local SIP profile
-     */
-    public SipProfile getLocalProfile() {
-        synchronized (this) {
-            return mLocalProfile;
-        }
-    }
-
-    /**
-     * Gets the peer's SIP profile.
-     *
-     * @return the peer's SIP profile
-     */
-    public SipProfile getPeerProfile() {
-        synchronized (this) {
-            return (mSipSession == null) ? null : mSipSession.getPeerProfile();
-        }
-    }
-
-    /**
-     * Gets the state of the {@link SipSession} that carries this call.
-     * The value returned must be one of the states in {@link SipSession.State}.
-     *
-     * @return the session state
-     */
-    public int getState() {
-        synchronized (this) {
-            if (mSipSession == null) return SipSession.State.READY_TO_CALL;
-            return mSipSession.getState();
-        }
-    }
-
-
-    /**
-     * Gets the {@link SipSession} that carries this call.
-     *
-     * @return the session object that carries this call
-     * @hide
-     */
-    public SipSession getSipSession() {
-        synchronized (this) {
-            return mSipSession;
-        }
-    }
-
-    private synchronized void transferToNewSession() {
-        if (mTransferringSession == null) return;
-        SipSession origin = mSipSession;
-        mSipSession = mTransferringSession;
-        mTransferringSession = null;
-
-        // stop the replaced call.
-        if (mAudioStream != null) {
-            mAudioStream.join(null);
-        } else {
-            try {
-                mAudioStream = new AudioStream(InetAddress.getByName(
-                        getLocalIp()));
-            } catch (Throwable t) {
-                Log.i(TAG, "transferToNewSession(): " + t);
-            }
-        }
-        if (origin != null) origin.endCall();
-        startAudio();
-    }
-
-    private SipSession.Listener createListener() {
-        return new SipSession.Listener() {
-            @Override
-            public void onCalling(SipSession session) {
-                Log.d(TAG, "calling... " + session);
-                Listener listener = mListener;
-                if (listener != null) {
-                    try {
-                        listener.onCalling(SipAudioCall.this);
-                    } catch (Throwable t) {
-                        Log.i(TAG, "onCalling(): " + t);
-                    }
-                }
-            }
-
-            @Override
-            public void onRingingBack(SipSession session) {
-                Log.d(TAG, "sip call ringing back: " + session);
-                Listener listener = mListener;
-                if (listener != null) {
-                    try {
-                        listener.onRingingBack(SipAudioCall.this);
-                    } catch (Throwable t) {
-                        Log.i(TAG, "onRingingBack(): " + t);
-                    }
-                }
-            }
-
-            @Override
-            public void onRinging(SipSession session,
-                    SipProfile peerProfile, String sessionDescription) {
-                // this callback is triggered only for reinvite.
-                synchronized (SipAudioCall.this) {
-                    if ((mSipSession == null) || !mInCall
-                            || !session.getCallId().equals(
-                                    mSipSession.getCallId())) {
-                        // should not happen
-                        session.endCall();
-                        return;
-                    }
-
-                    // session changing request
-                    try {
-                        String answer = createAnswer(sessionDescription).encode();
-                        mSipSession.answerCall(answer, SESSION_TIMEOUT);
-                    } catch (Throwable e) {
-                        Log.e(TAG, "onRinging()", e);
-                        session.endCall();
-                    }
-                }
-            }
-
-            @Override
-            public void onCallEstablished(SipSession session,
-                    String sessionDescription) {
-                mPeerSd = sessionDescription;
-                Log.v(TAG, "onCallEstablished()" + mPeerSd);
-
-                // TODO: how to notify the UI that the remote party is changed
-                if ((mTransferringSession != null)
-                        && (session == mTransferringSession)) {
-                    transferToNewSession();
-                    return;
-                }
-
-                Listener listener = mListener;
-                if (listener != null) {
-                    try {
-                        if (mHold) {
-                            listener.onCallHeld(SipAudioCall.this);
-                        } else {
-                            listener.onCallEstablished(SipAudioCall.this);
-                        }
-                    } catch (Throwable t) {
-                        Log.i(TAG, "onCallEstablished(): " + t);
-                    }
-                }
-            }
-
-            @Override
-            public void onCallEnded(SipSession session) {
-                Log.d(TAG, "sip call ended: " + session + " mSipSession:" + mSipSession);
-                // reset the trasnferring session if it is the one.
-                if (session == mTransferringSession) {
-                    mTransferringSession = null;
-                    return;
-                }
-                // or ignore the event if the original session is being
-                // transferred to the new one.
-                if ((mTransferringSession != null) ||
-                    (session != mSipSession)) return;
-
-                Listener listener = mListener;
-                if (listener != null) {
-                    try {
-                        listener.onCallEnded(SipAudioCall.this);
-                    } catch (Throwable t) {
-                        Log.i(TAG, "onCallEnded(): " + t);
-                    }
-                }
-                close();
-            }
-
-            @Override
-            public void onCallBusy(SipSession session) {
-                Log.d(TAG, "sip call busy: " + session);
-                Listener listener = mListener;
-                if (listener != null) {
-                    try {
-                        listener.onCallBusy(SipAudioCall.this);
-                    } catch (Throwable t) {
-                        Log.i(TAG, "onCallBusy(): " + t);
-                    }
-                }
-                close(false);
-            }
-
-            @Override
-            public void onCallChangeFailed(SipSession session, int errorCode,
-                    String message) {
-                Log.d(TAG, "sip call change failed: " + message);
-                mErrorCode = errorCode;
-                mErrorMessage = message;
-                Listener listener = mListener;
-                if (listener != null) {
-                    try {
-                        listener.onError(SipAudioCall.this, mErrorCode,
-                                message);
-                    } catch (Throwable t) {
-                        Log.i(TAG, "onCallBusy(): " + t);
-                    }
-                }
-            }
-
-            @Override
-            public void onError(SipSession session, int errorCode,
-                    String message) {
-                SipAudioCall.this.onError(errorCode, message);
-            }
-
-            @Override
-            public void onRegistering(SipSession session) {
-                // irrelevant
-            }
-
-            @Override
-            public void onRegistrationTimeout(SipSession session) {
-                // irrelevant
-            }
-
-            @Override
-            public void onRegistrationFailed(SipSession session, int errorCode,
-                    String message) {
-                // irrelevant
-            }
-
-            @Override
-            public void onRegistrationDone(SipSession session, int duration) {
-                // irrelevant
-            }
-
-            @Override
-            public void onCallTransferring(SipSession newSession,
-                    String sessionDescription) {
-                Log.v(TAG, "onCallTransferring mSipSession:"
-                        + mSipSession + " newSession:" + newSession);
-                mTransferringSession = newSession;
-                try {
-                    if (sessionDescription == null) {
-                        newSession.makeCall(newSession.getPeerProfile(),
-                                createOffer().encode(), TRANSFER_TIMEOUT);
-                    } else {
-                        String answer = createAnswer(sessionDescription).encode();
-                        newSession.answerCall(answer, SESSION_TIMEOUT);
-                    }
-                } catch (Throwable e) {
-                    Log.e(TAG, "onCallTransferring()", e);
-                    newSession.endCall();
-                }
-            }
-        };
-    }
-
-    private void onError(int errorCode, String message) {
-        Log.d(TAG, "sip session error: "
-                + SipErrorCode.toString(errorCode) + ": " + message);
-        mErrorCode = errorCode;
-        mErrorMessage = message;
-        Listener listener = mListener;
-        if (listener != null) {
-            try {
-                listener.onError(this, errorCode, message);
-            } catch (Throwable t) {
-                Log.i(TAG, "onError(): " + t);
-            }
-        }
-        synchronized (this) {
-            if ((errorCode == SipErrorCode.DATA_CONNECTION_LOST)
-                    || !isInCall()) {
-                close(true);
-            }
-        }
-    }
-
-    /**
-     * Attaches an incoming call to this call object.
-     *
-     * @param session the session that receives the incoming call
-     * @param sessionDescription the session description of the incoming call
-     * @throws SipException if the SIP service fails to attach this object to
-     *        the session or VOIP API is not supported by the device
-     * @see SipManager#isVoipSupported
-     */
-    public void attachCall(SipSession session, String sessionDescription)
-            throws SipException {
-        if (!SipManager.isVoipSupported(mContext)) {
-            throw new SipException("VOIP API is not supported");
-        }
-
-        synchronized (this) {
-            mSipSession = session;
-            mPeerSd = sessionDescription;
-            Log.v(TAG, "attachCall()" + mPeerSd);
-            try {
-                session.setListener(createListener());
-            } catch (Throwable e) {
-                Log.e(TAG, "attachCall()", e);
-                throwSipException(e);
-            }
-        }
-    }
-
-    /**
-     * Initiates an audio call to the specified profile. The attempt will be
-     * timed out if the call is not established within {@code timeout} seconds
-     * and {@link Listener#onError onError(SipAudioCall, SipErrorCode.TIME_OUT, String)}
-     * will be called.
-     *
-     * @param peerProfile the SIP profile to make the call to
-     * @param sipSession the {@link SipSession} for carrying out the call
-     * @param timeout the timeout value in seconds. Default value (defined by
-     *        SIP protocol) is used if {@code timeout} is zero or negative.
-     * @see Listener#onError
-     * @throws SipException if the SIP service fails to create a session for the
-     *        call or VOIP API is not supported by the device
-     * @see SipManager#isVoipSupported
-     */
-    public void makeCall(SipProfile peerProfile, SipSession sipSession,
-            int timeout) throws SipException {
-        if (!SipManager.isVoipSupported(mContext)) {
-            throw new SipException("VOIP API is not supported");
-        }
-
-        synchronized (this) {
-            mSipSession = sipSession;
-            try {
-                mAudioStream = new AudioStream(InetAddress.getByName(
-                        getLocalIp()));
-                sipSession.setListener(createListener());
-                sipSession.makeCall(peerProfile, createOffer().encode(),
-                        timeout);
-            } catch (IOException e) {
-                throw new SipException("makeCall()", e);
-            }
-        }
-    }
-
-    /**
-     * Ends a call.
-     * @throws SipException if the SIP service fails to end the call
-     */
-    public void endCall() throws SipException {
-        synchronized (this) {
-            stopCall(RELEASE_SOCKET);
-            mInCall = false;
-
-            // perform the above local ops first and then network op
-            if (mSipSession != null) mSipSession.endCall();
-        }
-    }
-
-    /**
-     * Puts a call on hold.  When succeeds, {@link Listener#onCallHeld} is
-     * called. The attempt will be timed out if the call is not established
-     * within {@code timeout} seconds and
-     * {@link Listener#onError onError(SipAudioCall, SipErrorCode.TIME_OUT, String)}
-     * will be called.
-     *
-     * @param timeout the timeout value in seconds. Default value (defined by
-     *        SIP protocol) is used if {@code timeout} is zero or negative.
-     * @see Listener#onError
-     * @throws SipException if the SIP service fails to hold the call
-     */
-    public void holdCall(int timeout) throws SipException {
-        synchronized (this) {
-            if (mHold) return;
-            if (mSipSession == null) {
-                throw new SipException("Not in a call to hold call");
-            }
-            mSipSession.changeCall(createHoldOffer().encode(), timeout);
-            mHold = true;
-            setAudioGroupMode();
-        }
-    }
-
-    /**
-     * Answers a call. The attempt will be timed out if the call is not
-     * established within {@code timeout} seconds and
-     * {@link Listener#onError onError(SipAudioCall, SipErrorCode.TIME_OUT, String)}
-     * will be called.
-     *
-     * @param timeout the timeout value in seconds. Default value (defined by
-     *        SIP protocol) is used if {@code timeout} is zero or negative.
-     * @see Listener#onError
-     * @throws SipException if the SIP service fails to answer the call
-     */
-    public void answerCall(int timeout) throws SipException {
-        synchronized (this) {
-            if (mSipSession == null) {
-                throw new SipException("No call to answer");
-            }
-            try {
-                mAudioStream = new AudioStream(InetAddress.getByName(
-                        getLocalIp()));
-                mSipSession.answerCall(createAnswer(mPeerSd).encode(), timeout);
-            } catch (IOException e) {
-                throw new SipException("answerCall()", e);
-            }
-        }
-    }
-
-    /**
-     * Continues a call that's on hold. When succeeds,
-     * {@link Listener#onCallEstablished} is called. The attempt will be timed
-     * out if the call is not established within {@code timeout} seconds and
-     * {@link Listener#onError onError(SipAudioCall, SipErrorCode.TIME_OUT, String)}
-     * will be called.
-     *
-     * @param timeout the timeout value in seconds. Default value (defined by
-     *        SIP protocol) is used if {@code timeout} is zero or negative.
-     * @see Listener#onError
-     * @throws SipException if the SIP service fails to unhold the call
-     */
-    public void continueCall(int timeout) throws SipException {
-        synchronized (this) {
-            if (!mHold) return;
-            mSipSession.changeCall(createContinueOffer().encode(), timeout);
-            mHold = false;
-            setAudioGroupMode();
-        }
-    }
-
-    private SimpleSessionDescription createOffer() {
-        SimpleSessionDescription offer =
-                new SimpleSessionDescription(mSessionId, getLocalIp());
-        AudioCodec[] codecs = AudioCodec.getCodecs();
-        Media media = offer.newMedia(
-                "audio", mAudioStream.getLocalPort(), 1, "RTP/AVP");
-        for (AudioCodec codec : AudioCodec.getCodecs()) {
-            media.setRtpPayload(codec.type, codec.rtpmap, codec.fmtp);
-        }
-        media.setRtpPayload(127, "telephone-event/8000", "0-15");
-        return offer;
-    }
-
-    private SimpleSessionDescription createAnswer(String offerSd) {
-        if (TextUtils.isEmpty(offerSd)) return createOffer();
-        SimpleSessionDescription offer =
-                new SimpleSessionDescription(offerSd);
-        SimpleSessionDescription answer =
-                new SimpleSessionDescription(mSessionId, getLocalIp());
-        AudioCodec codec = null;
-        for (Media media : offer.getMedia()) {
-            if ((codec == null) && (media.getPort() > 0)
-                    && "audio".equals(media.getType())
-                    && "RTP/AVP".equals(media.getProtocol())) {
-                // Find the first audio codec we supported.
-                for (int type : media.getRtpPayloadTypes()) {
-                    codec = AudioCodec.getCodec(type, media.getRtpmap(type),
-                            media.getFmtp(type));
-                    if (codec != null) {
-                        break;
-                    }
-                }
-                if (codec != null) {
-                    Media reply = answer.newMedia(
-                            "audio", mAudioStream.getLocalPort(), 1, "RTP/AVP");
-                    reply.setRtpPayload(codec.type, codec.rtpmap, codec.fmtp);
-
-                    // Check if DTMF is supported in the same media.
-                    for (int type : media.getRtpPayloadTypes()) {
-                        String rtpmap = media.getRtpmap(type);
-                        if ((type != codec.type) && (rtpmap != null)
-                                && rtpmap.startsWith("telephone-event")) {
-                            reply.setRtpPayload(
-                                    type, rtpmap, media.getFmtp(type));
-                        }
-                    }
-
-                    // Handle recvonly and sendonly.
-                    if (media.getAttribute("recvonly") != null) {
-                        answer.setAttribute("sendonly", "");
-                    } else if(media.getAttribute("sendonly") != null) {
-                        answer.setAttribute("recvonly", "");
-                    } else if(offer.getAttribute("recvonly") != null) {
-                        answer.setAttribute("sendonly", "");
-                    } else if(offer.getAttribute("sendonly") != null) {
-                        answer.setAttribute("recvonly", "");
-                    }
-                    continue;
-                }
-            }
-            // Reject the media.
-            Media reply = answer.newMedia(
-                    media.getType(), 0, 1, media.getProtocol());
-            for (String format : media.getFormats()) {
-                reply.setFormat(format, null);
-            }
-        }
-        if (codec == null) {
-            throw new IllegalStateException("Reject SDP: no suitable codecs");
-        }
-        return answer;
-    }
-
-    private SimpleSessionDescription createHoldOffer() {
-        SimpleSessionDescription offer = createContinueOffer();
-        offer.setAttribute("sendonly", "");
-        return offer;
-    }
-
-    private SimpleSessionDescription createContinueOffer() {
-        SimpleSessionDescription offer =
-                new SimpleSessionDescription(mSessionId, getLocalIp());
-        Media media = offer.newMedia(
-                "audio", mAudioStream.getLocalPort(), 1, "RTP/AVP");
-        AudioCodec codec = mAudioStream.getCodec();
-        media.setRtpPayload(codec.type, codec.rtpmap, codec.fmtp);
-        int dtmfType = mAudioStream.getDtmfType();
-        if (dtmfType != -1) {
-            media.setRtpPayload(dtmfType, "telephone-event/8000", "0-15");
-        }
-        return offer;
-    }
-
-    private void grabWifiHighPerfLock() {
-        if (mWifiHighPerfLock == null) {
-            Log.v(TAG, "acquire wifi high perf lock");
-            mWifiHighPerfLock = ((WifiManager)
-                    mContext.getSystemService(Context.WIFI_SERVICE))
-                    .createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
-            mWifiHighPerfLock.acquire();
-        }
-    }
-
-    private void releaseWifiHighPerfLock() {
-        if (mWifiHighPerfLock != null) {
-            Log.v(TAG, "release wifi high perf lock");
-            mWifiHighPerfLock.release();
-            mWifiHighPerfLock = null;
-        }
-    }
-
-    private boolean isWifiOn() {
-        return (mWm.getConnectionInfo().getBSSID() == null) ? false : true;
-    }
-
-    /** Toggles mute. */
-    public void toggleMute() {
-        synchronized (this) {
-            mMuted = !mMuted;
-            setAudioGroupMode();
-        }
-    }
-
-    /**
-     * Checks if the call is muted.
-     *
-     * @return true if the call is muted
-     */
-    public boolean isMuted() {
-        synchronized (this) {
-            return mMuted;
-        }
-    }
-
-    /**
-     * Puts the device to speaker mode.
-     * <p class="note"><strong>Note:</strong> Requires the
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS} permission.</p>
-     *
-     * @param speakerMode set true to enable speaker mode; false to disable
-     */
-    public void setSpeakerMode(boolean speakerMode) {
-        synchronized (this) {
-            ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE))
-                    .setSpeakerphoneOn(speakerMode);
-            setAudioGroupMode();
-        }
-    }
-
-    private boolean isSpeakerOn() {
-        return ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE))
-                .isSpeakerphoneOn();
-    }
-
-    /**
-     * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2883</a>,
-     * event 0--9 maps to decimal
-     * value 0--9, '*' to 10, '#' to 11, event 'A'--'D' to 12--15, and event
-     * flash to 16. Currently, event flash is not supported.
-     *
-     * @param code the DTMF code to send. Value 0 to 15 (inclusive) are valid
-     *        inputs.
-     */
-    public void sendDtmf(int code) {
-        sendDtmf(code, null);
-    }
-
-    /**
-     * Sends a DTMF code. According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2883</a>,
-     * event 0--9 maps to decimal
-     * value 0--9, '*' to 10, '#' to 11, event 'A'--'D' to 12--15, and event
-     * flash to 16. Currently, event flash is not supported.
-     *
-     * @param code the DTMF code to send. Value 0 to 15 (inclusive) are valid
-     *        inputs.
-     * @param result the result message to send when done
-     */
-    public void sendDtmf(int code, Message result) {
-        synchronized (this) {
-            AudioGroup audioGroup = getAudioGroup();
-            if ((audioGroup != null) && (mSipSession != null)
-                    && (SipSession.State.IN_CALL == getState())) {
-                Log.v(TAG, "send DTMF: " + code);
-                audioGroup.sendDtmf(code);
-            }
-            if (result != null) result.sendToTarget();
-        }
-    }
-
-    /**
-     * Gets the {@link AudioStream} object used in this call. The object
-     * represents the RTP stream that carries the audio data to and from the
-     * peer. The object may not be created before the call is established. And
-     * it is undefined after the call ends or the {@link #close} method is
-     * called.
-     *
-     * @return the {@link AudioStream} object or null if the RTP stream has not
-     *      yet been set up
-     * @hide
-     */
-    public AudioStream getAudioStream() {
-        synchronized (this) {
-            return mAudioStream;
-        }
-    }
-
-    /**
-     * Gets the {@link AudioGroup} object which the {@link AudioStream} object
-     * joins. The group object may not exist before the call is established.
-     * Also, the {@code AudioStream} may change its group during a call (e.g.,
-     * after the call is held/un-held). Finally, the {@code AudioGroup} object
-     * returned by this method is undefined after the call ends or the
-     * {@link #close} method is called. If a group object is set by
-     * {@link #setAudioGroup(AudioGroup)}, then this method returns that object.
-     *
-     * @return the {@link AudioGroup} object or null if the RTP stream has not
-     *      yet been set up
-     * @see #getAudioStream
-     * @hide
-     */
-    public AudioGroup getAudioGroup() {
-        synchronized (this) {
-            if (mAudioGroup != null) return mAudioGroup;
-            return ((mAudioStream == null) ? null : mAudioStream.getGroup());
-        }
-    }
-
-    /**
-     * Sets the {@link AudioGroup} object which the {@link AudioStream} object
-     * joins. If {@code audioGroup} is null, then the {@code AudioGroup} object
-     * will be dynamically created when needed. Note that the mode of the
-     * {@code AudioGroup} is not changed according to the audio settings (i.e.,
-     * hold, mute, speaker phone) of this object. This is mainly used to merge
-     * multiple {@code SipAudioCall} objects to form a conference call. The
-     * settings of the first object (that merges others) override others'.
-     *
-     * @see #getAudioStream
-     * @hide
-     */
-    public void setAudioGroup(AudioGroup group) {
-        synchronized (this) {
-            if ((mAudioStream != null) && (mAudioStream.getGroup() != null)) {
-                mAudioStream.join(group);
-            }
-            mAudioGroup = group;
-        }
-    }
-
-    /**
-     * Starts the audio for the established call. This method should be called
-     * after {@link Listener#onCallEstablished} is called.
-     * <p class="note"><strong>Note:</strong> Requires the
-     *   {@link android.Manifest.permission#RECORD_AUDIO},
-     *   {@link android.Manifest.permission#ACCESS_WIFI_STATE} and
-     *   {@link android.Manifest.permission#WAKE_LOCK} permissions.</p>
-     */
-    public void startAudio() {
-        try {
-            startAudioInternal();
-        } catch (UnknownHostException e) {
-            onError(SipErrorCode.PEER_NOT_REACHABLE, e.getMessage());
-        } catch (Throwable e) {
-            onError(SipErrorCode.CLIENT_ERROR, e.getMessage());
-        }
-    }
-
-    private synchronized void startAudioInternal() throws UnknownHostException {
-        if (mPeerSd == null) {
-            Log.v(TAG, "startAudioInternal() mPeerSd = null");
-            throw new IllegalStateException("mPeerSd = null");
-        }
-
-        stopCall(DONT_RELEASE_SOCKET);
-        mInCall = true;
-
-        // Run exact the same logic in createAnswer() to setup mAudioStream.
-        SimpleSessionDescription offer =
-                new SimpleSessionDescription(mPeerSd);
-        AudioStream stream = mAudioStream;
-        AudioCodec codec = null;
-        for (Media media : offer.getMedia()) {
-            if ((codec == null) && (media.getPort() > 0)
-                    && "audio".equals(media.getType())
-                    && "RTP/AVP".equals(media.getProtocol())) {
-                // Find the first audio codec we supported.
-                for (int type : media.getRtpPayloadTypes()) {
-                    codec = AudioCodec.getCodec(
-                            type, media.getRtpmap(type), media.getFmtp(type));
-                    if (codec != null) {
-                        break;
-                    }
-                }
-
-                if (codec != null) {
-                    // Associate with the remote host.
-                    String address = media.getAddress();
-                    if (address == null) {
-                        address = offer.getAddress();
-                    }
-                    stream.associate(InetAddress.getByName(address),
-                            media.getPort());
-
-                    stream.setDtmfType(-1);
-                    stream.setCodec(codec);
-                    // Check if DTMF is supported in the same media.
-                    for (int type : media.getRtpPayloadTypes()) {
-                        String rtpmap = media.getRtpmap(type);
-                        if ((type != codec.type) && (rtpmap != null)
-                                && rtpmap.startsWith("telephone-event")) {
-                            stream.setDtmfType(type);
-                        }
-                    }
-
-                    // Handle recvonly and sendonly.
-                    if (mHold) {
-                        stream.setMode(RtpStream.MODE_NORMAL);
-                    } else if (media.getAttribute("recvonly") != null) {
-                        stream.setMode(RtpStream.MODE_SEND_ONLY);
-                    } else if(media.getAttribute("sendonly") != null) {
-                        stream.setMode(RtpStream.MODE_RECEIVE_ONLY);
-                    } else if(offer.getAttribute("recvonly") != null) {
-                        stream.setMode(RtpStream.MODE_SEND_ONLY);
-                    } else if(offer.getAttribute("sendonly") != null) {
-                        stream.setMode(RtpStream.MODE_RECEIVE_ONLY);
-                    } else {
-                        stream.setMode(RtpStream.MODE_NORMAL);
-                    }
-                    break;
-                }
-            }
-        }
-        if (codec == null) {
-            throw new IllegalStateException("Reject SDP: no suitable codecs");
-        }
-
-        if (isWifiOn()) grabWifiHighPerfLock();
-
-        // AudioGroup logic:
-        AudioGroup audioGroup = getAudioGroup();
-        if (mHold) {
-            // don't create an AudioGroup here; doing so will fail if
-            // there's another AudioGroup out there that's active
-        } else {
-            if (audioGroup == null) audioGroup = new AudioGroup();
-            stream.join(audioGroup);
-        }
-        setAudioGroupMode();
-    }
-
-    // set audio group mode based on current audio configuration
-    private void setAudioGroupMode() {
-        AudioGroup audioGroup = getAudioGroup();
-        if (audioGroup != null) {
-            if (mHold) {
-                audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
-            } else if (mMuted) {
-                audioGroup.setMode(AudioGroup.MODE_MUTED);
-            } else if (isSpeakerOn()) {
-                audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
-            } else {
-                audioGroup.setMode(AudioGroup.MODE_NORMAL);
-            }
-        }
-    }
-
-    private void stopCall(boolean releaseSocket) {
-        Log.d(TAG, "stop audiocall");
-        releaseWifiHighPerfLock();
-        if (mAudioStream != null) {
-            mAudioStream.join(null);
-
-            if (releaseSocket) {
-                mAudioStream.release();
-                mAudioStream = null;
-            }
-        }
-    }
-
-    private String getLocalIp() {
-        return mSipSession.getLocalIp();
-    }
-
-    private void throwSipException(Throwable throwable) throws SipException {
-        if (throwable instanceof SipException) {
-            throw (SipException) throwable;
-        } else {
-            throw new SipException("", throwable);
-        }
-    }
-
-    private SipProfile getPeerProfile(SipSession session) {
-        return session.getPeerProfile();
-    }
-}
diff --git a/voip/java/android/net/sip/SipErrorCode.java b/voip/java/android/net/sip/SipErrorCode.java
deleted file mode 100644
index 509728f..0000000
--- a/voip/java/android/net/sip/SipErrorCode.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-/**
- * Defines error codes returned during SIP actions. For example, during
- * {@link SipRegistrationListener#onRegistrationFailed onRegistrationFailed()},
- * {@link SipSession.Listener#onError onError()},
- * {@link SipSession.Listener#onCallChangeFailed onCallChangeFailed()} and
- * {@link SipSession.Listener#onRegistrationFailed onRegistrationFailed()}.
- */
-public class SipErrorCode {
-    /** Not an error. */
-    public static final int NO_ERROR = 0;
-
-    /** When some socket error occurs. */
-    public static final int SOCKET_ERROR = -1;
-
-    /** When server responds with an error. */
-    public static final int SERVER_ERROR = -2;
-
-    /** When transaction is terminated unexpectedly. */
-    public static final int TRANSACTION_TERMINTED = -3;
-
-    /** When some error occurs on the device, possibly due to a bug. */
-    public static final int CLIENT_ERROR = -4;
-
-    /** When the transaction gets timed out. */
-    public static final int TIME_OUT = -5;
-
-    /** When the remote URI is not valid. */
-    public static final int INVALID_REMOTE_URI = -6;
-
-    /** When the peer is not reachable. */
-    public static final int PEER_NOT_REACHABLE = -7;
-
-    /** When invalid credentials are provided. */
-    public static final int INVALID_CREDENTIALS = -8;
-
-    /** The client is in a transaction and cannot initiate a new one. */
-    public static final int IN_PROGRESS = -9;
-
-    /** When data connection is lost. */
-    public static final int DATA_CONNECTION_LOST = -10;
-
-    /** Cross-domain authentication required. */
-    public static final int CROSS_DOMAIN_AUTHENTICATION = -11;
-
-    /** When the server is not reachable. */
-    public static final int SERVER_UNREACHABLE = -12;
-
-    public static String toString(int errorCode) {
-        switch (errorCode) {
-            case NO_ERROR:
-                return "NO_ERROR";
-            case SOCKET_ERROR:
-                return "SOCKET_ERROR";
-            case SERVER_ERROR:
-                return "SERVER_ERROR";
-            case TRANSACTION_TERMINTED:
-                return "TRANSACTION_TERMINTED";
-            case CLIENT_ERROR:
-                return "CLIENT_ERROR";
-            case TIME_OUT:
-                return "TIME_OUT";
-            case INVALID_REMOTE_URI:
-                return "INVALID_REMOTE_URI";
-            case PEER_NOT_REACHABLE:
-                return "PEER_NOT_REACHABLE";
-            case INVALID_CREDENTIALS:
-                return "INVALID_CREDENTIALS";
-            case IN_PROGRESS:
-                return "IN_PROGRESS";
-            case DATA_CONNECTION_LOST:
-                return "DATA_CONNECTION_LOST";
-            case CROSS_DOMAIN_AUTHENTICATION:
-                return "CROSS_DOMAIN_AUTHENTICATION";
-            case SERVER_UNREACHABLE:
-                return "SERVER_UNREACHABLE";
-            default:
-                return "UNKNOWN";
-        }
-    }
-
-    private SipErrorCode() {
-    }
-}
diff --git a/voip/java/android/net/sip/SipException.java b/voip/java/android/net/sip/SipException.java
deleted file mode 100644
index 0339395..0000000
--- a/voip/java/android/net/sip/SipException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-/**
- * Indicates a general SIP-related exception.
- */
-public class SipException extends Exception {
-    public SipException() {
-    }
-
-    public SipException(String message) {
-        super(message);
-    }
-
-    public SipException(String message, Throwable cause) {
-        // we want to eliminate the dependency on javax.sip.SipException
-        super(message, ((cause instanceof javax.sip.SipException)
-                && (cause.getCause() != null))
-                ? cause.getCause()
-                : cause);
-    }
-}
diff --git a/voip/java/android/net/sip/SipManager.java b/voip/java/android/net/sip/SipManager.java
deleted file mode 100644
index 74c3672..0000000
--- a/voip/java/android/net/sip/SipManager.java
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.util.Log;
-
-import java.text.ParseException;
-
-/**
- * Provides APIs for SIP tasks, such as initiating SIP connections, and provides access to related
- * SIP services. This class is the starting point for any SIP actions. You can acquire an instance
- * of it with {@link #newInstance newInstance()}.</p>
- * <p>The APIs in this class allows you to:</p>
- * <ul>
- * <li>Create a {@link SipSession} to get ready for making calls or listen for incoming calls. See
- * {@link #createSipSession createSipSession()} and {@link #getSessionFor getSessionFor()}.</li>
- * <li>Initiate and receive generic SIP calls or audio-only SIP calls. Generic SIP calls may
- * be video, audio, or other, and are initiated with {@link #open open()}. Audio-only SIP calls
- * should be handled with a {@link SipAudioCall}, which you can acquire with {@link
- * #makeAudioCall makeAudioCall()} and {@link #takeAudioCall takeAudioCall()}.</li>
- * <li>Register and unregister with a SIP service provider, with
- *      {@link #register register()} and {@link #unregister unregister()}.</li>
- * <li>Verify session connectivity, with {@link #isOpened isOpened()} and
- *      {@link #isRegistered isRegistered()}.</li>
- * </ul>
- * <p class="note"><strong>Note:</strong> Not all Android-powered devices support VOIP calls using
- * SIP. You should always call {@link android.net.sip.SipManager#isVoipSupported
- * isVoipSupported()} to verify that the device supports VOIP calling and {@link
- * android.net.sip.SipManager#isApiSupported isApiSupported()} to verify that the device supports
- * the SIP APIs. Your application must also request the {@link
- * android.Manifest.permission#INTERNET} and {@link android.Manifest.permission#USE_SIP}
- * permissions.</p>
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about using SIP, read the
- * <a href="{@docRoot}guide/topics/network/sip.html">Session Initiation Protocol</a>
- * developer guide.</p>
- * </div>
- */
-public class SipManager {
-    /**
-     * The result code to be sent back with the incoming call
-     * {@link PendingIntent}.
-     * @see #open(SipProfile, PendingIntent, SipRegistrationListener)
-     */
-    public static final int INCOMING_CALL_RESULT_CODE = 101;
-
-    /**
-     * Key to retrieve the call ID from an incoming call intent.
-     * @see #open(SipProfile, PendingIntent, SipRegistrationListener)
-     */
-    public static final String EXTRA_CALL_ID = "android:sipCallID";
-
-    /**
-     * Key to retrieve the offered session description from an incoming call
-     * intent.
-     * @see #open(SipProfile, PendingIntent, SipRegistrationListener)
-     */
-    public static final String EXTRA_OFFER_SD = "android:sipOfferSD";
-
-    /**
-     * Action to broadcast when SipService is up.
-     * Internal use only.
-     * @hide
-     */
-    public static final String ACTION_SIP_SERVICE_UP =
-            "android.net.sip.SIP_SERVICE_UP";
-    /**
-     * Action string for the incoming call intent for the Phone app.
-     * Internal use only.
-     * @hide
-     */
-    public static final String ACTION_SIP_INCOMING_CALL =
-            "com.android.phone.SIP_INCOMING_CALL";
-    /**
-     * Action string for the add-phone intent.
-     * Internal use only.
-     * @hide
-     */
-    public static final String ACTION_SIP_ADD_PHONE =
-            "com.android.phone.SIP_ADD_PHONE";
-    /**
-     * Action string for the remove-phone intent.
-     * Internal use only.
-     * @hide
-     */
-    public static final String ACTION_SIP_REMOVE_PHONE =
-            "com.android.phone.SIP_REMOVE_PHONE";
-    /**
-     * Part of the ACTION_SIP_ADD_PHONE and ACTION_SIP_REMOVE_PHONE intents.
-     * Internal use only.
-     * @hide
-     */
-    public static final String EXTRA_LOCAL_URI = "android:localSipUri";
-
-    private static final String TAG = "SipManager";
-
-    private ISipService mSipService;
-    private Context mContext;
-
-    /**
-     * Creates a manager instance. Returns null if SIP API is not supported.
-     *
-     * @param context application context for creating the manager object
-     * @return the manager instance or null if SIP API is not supported
-     */
-    public static SipManager newInstance(Context context) {
-        return (isApiSupported(context) ? new SipManager(context) : null);
-    }
-
-    /**
-     * Returns true if the SIP API is supported by the system.
-     */
-    public static boolean isApiSupported(Context context) {
-        return context.getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_SIP);
-    }
-
-    /**
-     * Returns true if the system supports SIP-based VOIP API.
-     */
-    public static boolean isVoipSupported(Context context) {
-        return context.getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_SIP_VOIP) && isApiSupported(context);
-    }
-
-    /**
-     * Returns true if SIP is only available on WIFI.
-     */
-    public static boolean isSipWifiOnly(Context context) {
-        return context.getResources().getBoolean(
-                com.android.internal.R.bool.config_sip_wifi_only);
-    }
-
-    private SipManager(Context context) {
-        mContext = context;
-        createSipService();
-    }
-
-    private void createSipService() {
-        IBinder b = ServiceManager.getService(Context.SIP_SERVICE);
-        mSipService = ISipService.Stub.asInterface(b);
-    }
-
-    /**
-     * Opens the profile for making generic SIP calls. The caller may make subsequent calls
-     * through {@link #makeAudioCall}. If one also wants to receive calls on the
-     * profile, use
-     * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)}
-     * instead.
-     *
-     * @param localProfile the SIP profile to make calls from
-     * @throws SipException if the profile contains incorrect settings or
-     *      calling the SIP service results in an error
-     */
-    public void open(SipProfile localProfile) throws SipException {
-        try {
-            mSipService.open(localProfile);
-        } catch (RemoteException e) {
-            throw new SipException("open()", e);
-        }
-    }
-
-    /**
-     * Opens the profile for making calls and/or receiving generic SIP calls. The caller may
-     * make subsequent calls through {@link #makeAudioCall}. If the
-     * auto-registration option is enabled in the profile, the SIP service
-     * will register the profile to the corresponding SIP provider periodically
-     * in order to receive calls from the provider. When the SIP service
-     * receives a new call, it will send out an intent with the provided action
-     * string. The intent contains a call ID extra and an offer session
-     * description string extra. Use {@link #getCallId} and
-     * {@link #getOfferSessionDescription} to retrieve those extras.
-     *
-     * @param localProfile the SIP profile to receive incoming calls for
-     * @param incomingCallPendingIntent When an incoming call is received, the
-     *      SIP service will call
-     *      {@link PendingIntent#send(Context, int, Intent)} to send back the
-     *      intent to the caller with {@link #INCOMING_CALL_RESULT_CODE} as the
-     *      result code and the intent to fill in the call ID and session
-     *      description information. It cannot be null.
-     * @param listener to listen to registration events; can be null
-     * @see #getCallId
-     * @see #getOfferSessionDescription
-     * @see #takeAudioCall
-     * @throws NullPointerException if {@code incomingCallPendingIntent} is null
-     * @throws SipException if the profile contains incorrect settings or
-     *      calling the SIP service results in an error
-     * @see #isIncomingCallIntent
-     * @see #getCallId
-     * @see #getOfferSessionDescription
-     */
-    public void open(SipProfile localProfile,
-            PendingIntent incomingCallPendingIntent,
-            SipRegistrationListener listener) throws SipException {
-        if (incomingCallPendingIntent == null) {
-            throw new NullPointerException(
-                    "incomingCallPendingIntent cannot be null");
-        }
-        try {
-            mSipService.open3(localProfile, incomingCallPendingIntent,
-                    createRelay(listener, localProfile.getUriString()));
-        } catch (RemoteException e) {
-            throw new SipException("open()", e);
-        }
-    }
-
-    /**
-     * Sets the listener to listen to registration events. No effect if the
-     * profile has not been opened to receive calls (see
-     * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)}).
-     *
-     * @param localProfileUri the URI of the profile
-     * @param listener to listen to registration events; can be null
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public void setRegistrationListener(String localProfileUri,
-            SipRegistrationListener listener) throws SipException {
-        try {
-            mSipService.setRegistrationListener(
-                    localProfileUri, createRelay(listener, localProfileUri));
-        } catch (RemoteException e) {
-            throw new SipException("setRegistrationListener()", e);
-        }
-    }
-
-    /**
-     * Closes the specified profile to not make/receive calls. All the resources
-     * that were allocated to the profile are also released.
-     *
-     * @param localProfileUri the URI of the profile to close
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public void close(String localProfileUri) throws SipException {
-        try {
-            mSipService.close(localProfileUri);
-        } catch (RemoteException e) {
-            throw new SipException("close()", e);
-        }
-    }
-
-    /**
-     * Checks if the specified profile is opened in the SIP service for
-     * making and/or receiving calls.
-     *
-     * @param localProfileUri the URI of the profile in question
-     * @return true if the profile is enabled to receive calls
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public boolean isOpened(String localProfileUri) throws SipException {
-        try {
-            return mSipService.isOpened(localProfileUri);
-        } catch (RemoteException e) {
-            throw new SipException("isOpened()", e);
-        }
-    }
-
-    /**
-     * Checks if the SIP service has successfully registered the profile to the
-     * SIP provider (specified in the profile) for receiving calls. Returning
-     * true from this method also implies the profile is opened
-     * ({@link #isOpened}).
-     *
-     * @param localProfileUri the URI of the profile in question
-     * @return true if the profile is registered to the SIP provider; false if
-     *        the profile has not been opened in the SIP service or the SIP
-     *        service has not yet successfully registered the profile to the SIP
-     *        provider
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public boolean isRegistered(String localProfileUri) throws SipException {
-        try {
-            return mSipService.isRegistered(localProfileUri);
-        } catch (RemoteException e) {
-            throw new SipException("isRegistered()", e);
-        }
-    }
-
-    /**
-     * Creates a {@link SipAudioCall} to make a call. The attempt will be timed
-     * out if the call is not established within {@code timeout} seconds and
-     * {@link SipAudioCall.Listener#onError onError(SipAudioCall, SipErrorCode.TIME_OUT, String)}
-     * will be called.
-     *
-     * @param localProfile the SIP profile to make the call from
-     * @param peerProfile the SIP profile to make the call to
-     * @param listener to listen to the call events from {@link SipAudioCall};
-     *      can be null
-     * @param timeout the timeout value in seconds. Default value (defined by
-     *        SIP protocol) is used if {@code timeout} is zero or negative.
-     * @return a {@link SipAudioCall} object
-     * @throws SipException if calling the SIP service results in an error or
-     *      VOIP API is not supported by the device
-     * @see SipAudioCall.Listener#onError
-     * @see #isVoipSupported
-     */
-    public SipAudioCall makeAudioCall(SipProfile localProfile,
-            SipProfile peerProfile, SipAudioCall.Listener listener, int timeout)
-            throws SipException {
-        if (!isVoipSupported(mContext)) {
-            throw new SipException("VOIP API is not supported");
-        }
-        SipAudioCall call = new SipAudioCall(mContext, localProfile);
-        call.setListener(listener);
-        SipSession s = createSipSession(localProfile, null);
-        call.makeCall(peerProfile, s, timeout);
-        return call;
-    }
-
-    /**
-     * Creates a {@link SipAudioCall} to make an audio call. The attempt will be
-     * timed out if the call is not established within {@code timeout} seconds
-     * and
-     * {@link SipAudioCall.Listener#onError onError(SipAudioCall, SipErrorCode.TIME_OUT, String)}
-     * will be called.
-     *
-     * @param localProfileUri URI of the SIP profile to make the call from
-     * @param peerProfileUri URI of the SIP profile to make the call to
-     * @param listener to listen to the call events from {@link SipAudioCall};
-     *      can be null
-     * @param timeout the timeout value in seconds. Default value (defined by
-     *        SIP protocol) is used if {@code timeout} is zero or negative.
-     * @return a {@link SipAudioCall} object
-     * @throws SipException if calling the SIP service results in an error or
-     *      VOIP API is not supported by the device
-     * @see SipAudioCall.Listener#onError
-     * @see #isVoipSupported
-     */
-    public SipAudioCall makeAudioCall(String localProfileUri,
-            String peerProfileUri, SipAudioCall.Listener listener, int timeout)
-            throws SipException {
-        if (!isVoipSupported(mContext)) {
-            throw new SipException("VOIP API is not supported");
-        }
-        try {
-            return makeAudioCall(
-                    new SipProfile.Builder(localProfileUri).build(),
-                    new SipProfile.Builder(peerProfileUri).build(), listener,
-                    timeout);
-        } catch (ParseException e) {
-            throw new SipException("build SipProfile", e);
-        }
-    }
-
-    /**
-     * Creates a {@link SipAudioCall} to take an incoming call. Before the call
-     * is returned, the listener will receive a
-     * {@link SipAudioCall.Listener#onRinging}
-     * callback.
-     *
-     * @param incomingCallIntent the incoming call broadcast intent
-     * @param listener to listen to the call events from {@link SipAudioCall};
-     *      can be null
-     * @return a {@link SipAudioCall} object
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public SipAudioCall takeAudioCall(Intent incomingCallIntent,
-            SipAudioCall.Listener listener) throws SipException {
-        if (incomingCallIntent == null) {
-            throw new SipException("Cannot retrieve session with null intent");
-        }
-
-        String callId = getCallId(incomingCallIntent);
-        if (callId == null) {
-            throw new SipException("Call ID missing in incoming call intent");
-        }
-
-        String offerSd = getOfferSessionDescription(incomingCallIntent);
-        if (offerSd == null) {
-            throw new SipException("Session description missing in incoming "
-                    + "call intent");
-        }
-
-        try {
-            ISipSession session = mSipService.getPendingSession(callId);
-            if (session == null) {
-                throw new SipException("No pending session for the call");
-            }
-            SipAudioCall call = new SipAudioCall(
-                    mContext, session.getLocalProfile());
-            call.attachCall(new SipSession(session), offerSd);
-            call.setListener(listener);
-            return call;
-        } catch (Throwable t) {
-            throw new SipException("takeAudioCall()", t);
-        }
-    }
-
-    /**
-     * Checks if the intent is an incoming call broadcast intent.
-     *
-     * @param intent the intent in question
-     * @return true if the intent is an incoming call broadcast intent
-     */
-    public static boolean isIncomingCallIntent(Intent intent) {
-        if (intent == null) return false;
-        String callId = getCallId(intent);
-        String offerSd = getOfferSessionDescription(intent);
-        return ((callId != null) && (offerSd != null));
-    }
-
-    /**
-     * Gets the call ID from the specified incoming call broadcast intent.
-     *
-     * @param incomingCallIntent the incoming call broadcast intent
-     * @return the call ID or null if the intent does not contain it
-     */
-    public static String getCallId(Intent incomingCallIntent) {
-        return incomingCallIntent.getStringExtra(EXTRA_CALL_ID);
-    }
-
-    /**
-     * Gets the offer session description from the specified incoming call
-     * broadcast intent.
-     *
-     * @param incomingCallIntent the incoming call broadcast intent
-     * @return the offer session description or null if the intent does not
-     *      have it
-     */
-    public static String getOfferSessionDescription(Intent incomingCallIntent) {
-        return incomingCallIntent.getStringExtra(EXTRA_OFFER_SD);
-    }
-
-    /**
-     * Creates an incoming call broadcast intent.
-     *
-     * @param callId the call ID of the incoming call
-     * @param sessionDescription the session description of the incoming call
-     * @return the incoming call intent
-     * @hide
-     */
-    public static Intent createIncomingCallBroadcast(String callId,
-            String sessionDescription) {
-        Intent intent = new Intent();
-        intent.putExtra(EXTRA_CALL_ID, callId);
-        intent.putExtra(EXTRA_OFFER_SD, sessionDescription);
-        return intent;
-    }
-
-    /**
-     * Manually registers the profile to the corresponding SIP provider for
-     * receiving calls.
-     * {@link #open(SipProfile, PendingIntent, SipRegistrationListener)} is
-     * still needed to be called at least once in order for the SIP service to
-     * notify the caller with the {@link android.app.PendingIntent} when an incoming call is
-     * received.
-     *
-     * @param localProfile the SIP profile to register with
-     * @param expiryTime registration expiration time (in seconds)
-     * @param listener to listen to the registration events
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public void register(SipProfile localProfile, int expiryTime,
-            SipRegistrationListener listener) throws SipException {
-        try {
-            ISipSession session = mSipService.createSession(localProfile,
-                    createRelay(listener, localProfile.getUriString()));
-            if (session == null) {
-                throw new SipException(
-                        "SipService.createSession() returns null");
-            }
-            session.register(expiryTime);
-        } catch (RemoteException e) {
-            throw new SipException("register()", e);
-        }
-    }
-
-    /**
-     * Manually unregisters the profile from the corresponding SIP provider for
-     * stop receiving further calls. This may interference with the auto
-     * registration process in the SIP service if the auto-registration option
-     * in the profile is enabled.
-     *
-     * @param localProfile the SIP profile to register with
-     * @param listener to listen to the registration events
-     * @throws SipException if calling the SIP service results in an error
-     */
-    public void unregister(SipProfile localProfile,
-            SipRegistrationListener listener) throws SipException {
-        try {
-            ISipSession session = mSipService.createSession(localProfile,
-                    createRelay(listener, localProfile.getUriString()));
-            if (session == null) {
-                throw new SipException(
-                        "SipService.createSession() returns null");
-            }
-            session.unregister();
-        } catch (RemoteException e) {
-            throw new SipException("unregister()", e);
-        }
-    }
-
-    /**
-     * Gets the {@link SipSession} that handles the incoming call. For audio
-     * calls, consider to use {@link SipAudioCall} to handle the incoming call.
-     * See {@link #takeAudioCall}. Note that the method may be called only once
-     * for the same intent. For subsequent calls on the same intent, the method
-     * returns null.
-     *
-     * @param incomingCallIntent the incoming call broadcast intent
-     * @return the session object that handles the incoming call
-     */
-    public SipSession getSessionFor(Intent incomingCallIntent)
-            throws SipException {
-        try {
-            String callId = getCallId(incomingCallIntent);
-            ISipSession s = mSipService.getPendingSession(callId);
-            return ((s == null) ? null : new SipSession(s));
-        } catch (RemoteException e) {
-            throw new SipException("getSessionFor()", e);
-        }
-    }
-
-    private static ISipSessionListener createRelay(
-            SipRegistrationListener listener, String uri) {
-        return ((listener == null) ? null : new ListenerRelay(listener, uri));
-    }
-
-    /**
-     * Creates a {@link SipSession} with the specified profile. Use other
-     * methods, if applicable, instead of interacting with {@link SipSession}
-     * directly.
-     *
-     * @param localProfile the SIP profile the session is associated with
-     * @param listener to listen to SIP session events
-     */
-    public SipSession createSipSession(SipProfile localProfile,
-            SipSession.Listener listener) throws SipException {
-        try {
-            ISipSession s = mSipService.createSession(localProfile, null);
-            if (s == null) {
-                throw new SipException(
-                        "Failed to create SipSession; network unavailable?");
-            }
-            return new SipSession(s, listener);
-        } catch (RemoteException e) {
-            throw new SipException("createSipSession()", e);
-        }
-    }
-
-    /**
-     * Gets the list of profiles hosted by the SIP service. The user information
-     * (username, password and display name) are crossed out.
-     * @hide
-     */
-    public SipProfile[] getListOfProfiles() {
-        try {
-            return mSipService.getListOfProfiles();
-        } catch (RemoteException e) {
-            return new SipProfile[0];
-        }
-    }
-
-    private static class ListenerRelay extends SipSessionAdapter {
-        private SipRegistrationListener mListener;
-        private String mUri;
-
-        // listener must not be null
-        public ListenerRelay(SipRegistrationListener listener, String uri) {
-            mListener = listener;
-            mUri = uri;
-        }
-
-        private String getUri(ISipSession session) {
-            try {
-                return ((session == null)
-                        ? mUri
-                        : session.getLocalProfile().getUriString());
-            } catch (Throwable e) {
-                // SipService died? SIP stack died?
-                Log.w(TAG, "getUri(): " + e);
-                return null;
-            }
-        }
-
-        @Override
-        public void onRegistering(ISipSession session) {
-            mListener.onRegistering(getUri(session));
-        }
-
-        @Override
-        public void onRegistrationDone(ISipSession session, int duration) {
-            long expiryTime = duration;
-            if (duration > 0) expiryTime += System.currentTimeMillis();
-            mListener.onRegistrationDone(getUri(session), expiryTime);
-        }
-
-        @Override
-        public void onRegistrationFailed(ISipSession session, int errorCode,
-                String message) {
-            mListener.onRegistrationFailed(getUri(session), errorCode, message);
-        }
-
-        @Override
-        public void onRegistrationTimeout(ISipSession session) {
-            mListener.onRegistrationFailed(getUri(session),
-                    SipErrorCode.TIME_OUT, "registration timed out");
-        }
-    }
-}
diff --git a/voip/java/android/net/sip/SipProfile.aidl b/voip/java/android/net/sip/SipProfile.aidl
deleted file mode 100644
index 3b6f68f..0000000
--- a/voip/java/android/net/sip/SipProfile.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2010, 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.net.sip;
-
-parcelable SipProfile;
diff --git a/voip/java/android/net/sip/SipProfile.java b/voip/java/android/net/sip/SipProfile.java
deleted file mode 100644
index 0ef754c..0000000
--- a/voip/java/android/net/sip/SipProfile.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.io.ObjectStreamException;
-import java.io.Serializable;
-import java.text.ParseException;
-import javax.sip.InvalidArgumentException;
-import javax.sip.ListeningPoint;
-import javax.sip.PeerUnavailableException;
-import javax.sip.SipFactory;
-import javax.sip.address.Address;
-import javax.sip.address.AddressFactory;
-import javax.sip.address.SipURI;
-import javax.sip.address.URI;
-
-/**
- * Defines a SIP profile, including a SIP account, domain and server information.
- * <p>You can create a {@link SipProfile} using {@link
- * SipProfile.Builder}. You can also retrieve one from a {@link SipSession}, using {@link
- * SipSession#getLocalProfile} and {@link SipSession#getPeerProfile}.</p>
- *
- * <div class="special reference">
- * <h3>Developer Guides</h3>
- * <p>For more information about using SIP, read the
- * <a href="{@docRoot}guide/topics/network/sip.html">Session Initiation Protocol</a>
- * developer guide.</p>
- * </div>
- */
-public class SipProfile implements Parcelable, Serializable, Cloneable {
-    private static final long serialVersionUID = 1L;
-    private static final int DEFAULT_PORT = 5060;
-    private static final String TCP = "TCP";
-    private static final String UDP = "UDP";
-    private Address mAddress;
-    private String mProxyAddress;
-    private String mPassword;
-    private String mDomain;
-    private String mProtocol = UDP;
-    private String mProfileName;
-    private String mAuthUserName;
-    private int mPort = DEFAULT_PORT;
-    private boolean mSendKeepAlive = false;
-    private boolean mAutoRegistration = true;
-    private transient int mCallingUid = 0;
-
-    public static final Parcelable.Creator<SipProfile> CREATOR =
-            new Parcelable.Creator<SipProfile>() {
-                public SipProfile createFromParcel(Parcel in) {
-                    return new SipProfile(in);
-                }
-
-                public SipProfile[] newArray(int size) {
-                    return new SipProfile[size];
-                }
-            };
-
-    /**
-     * Helper class for creating a {@link SipProfile}.
-     */
-    public static class Builder {
-        private AddressFactory mAddressFactory;
-        private SipProfile mProfile = new SipProfile();
-        private SipURI mUri;
-        private String mDisplayName;
-        private String mProxyAddress;
-
-        {
-            try {
-                mAddressFactory =
-                        SipFactory.getInstance().createAddressFactory();
-            } catch (PeerUnavailableException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        /**
-         * Creates a builder based on the given profile.
-         */
-        public Builder(SipProfile profile) {
-            if (profile == null) throw new NullPointerException();
-            try {
-                mProfile = (SipProfile) profile.clone();
-            } catch (CloneNotSupportedException e) {
-                throw new RuntimeException("should not occur", e);
-            }
-            mProfile.mAddress = null;
-            mUri = profile.getUri();
-            mUri.setUserPassword(profile.getPassword());
-            mDisplayName = profile.getDisplayName();
-            mProxyAddress = profile.getProxyAddress();
-            mProfile.mPort = profile.getPort();
-        }
-
-        /**
-         * Constructor.
-         *
-         * @param uriString the URI string as "sip:<user_name>@<domain>"
-         * @throws ParseException if the string is not a valid URI
-         */
-        public Builder(String uriString) throws ParseException {
-            if (uriString == null) {
-                throw new NullPointerException("uriString cannot be null");
-            }
-            URI uri = mAddressFactory.createURI(fix(uriString));
-            if (uri instanceof SipURI) {
-                mUri = (SipURI) uri;
-            } else {
-                throw new ParseException(uriString + " is not a SIP URI", 0);
-            }
-            mProfile.mDomain = mUri.getHost();
-        }
-
-        /**
-         * Constructor.
-         *
-         * @param username username of the SIP account
-         * @param serverDomain the SIP server domain; if the network address
-         *      is different from the domain, use {@link #setOutboundProxy} to
-         *      set server address
-         * @throws ParseException if the parameters are not valid
-         */
-        public Builder(String username, String serverDomain)
-                throws ParseException {
-            if ((username == null) || (serverDomain == null)) {
-                throw new NullPointerException(
-                        "username and serverDomain cannot be null");
-            }
-            mUri = mAddressFactory.createSipURI(username, serverDomain);
-            mProfile.mDomain = serverDomain;
-        }
-
-        private String fix(String uriString) {
-            return (uriString.trim().toLowerCase().startsWith("sip:")
-                    ? uriString
-                    : "sip:" + uriString);
-        }
-
-        /**
-         * Sets the username used for authentication.
-         *
-         * @param name authentication username of the profile
-         * @return this builder object
-         */
-        public Builder setAuthUserName(String name) {
-            mProfile.mAuthUserName = name;
-            return this;
-        }
-
-        /**
-         * Sets the name of the profile. This name is given by user.
-         *
-         * @param name name of the profile
-         * @return this builder object
-         */
-        public Builder setProfileName(String name) {
-            mProfile.mProfileName = name;
-            return this;
-        }
-
-        /**
-         * Sets the password of the SIP account
-         *
-         * @param password password of the SIP account
-         * @return this builder object
-         */
-        public Builder setPassword(String password) {
-            mUri.setUserPassword(password);
-            return this;
-        }
-
-        /**
-         * Sets the port number of the server. By default, it is 5060.
-         *
-         * @param port port number of the server
-         * @return this builder object
-         * @throws IllegalArgumentException if the port number is out of range
-         */
-        public Builder setPort(int port) throws IllegalArgumentException {
-            if ((port > 65535) || (port < 1000)) {
-                throw new IllegalArgumentException("incorrect port arugment: " + port);
-            }
-            mProfile.mPort = port;
-            return this;
-        }
-
-        /**
-         * Sets the protocol used to connect to the SIP server. Currently,
-         * only "UDP" and "TCP" are supported.
-         *
-         * @param protocol the protocol string
-         * @return this builder object
-         * @throws IllegalArgumentException if the protocol is not recognized
-         */
-        public Builder setProtocol(String protocol)
-                throws IllegalArgumentException {
-            if (protocol == null) {
-                throw new NullPointerException("protocol cannot be null");
-            }
-            protocol = protocol.toUpperCase();
-            if (!protocol.equals(UDP) && !protocol.equals(TCP)) {
-                throw new IllegalArgumentException(
-                        "unsupported protocol: " + protocol);
-            }
-            mProfile.mProtocol = protocol;
-            return this;
-        }
-
-        /**
-         * Sets the outbound proxy of the SIP server.
-         *
-         * @param outboundProxy the network address of the outbound proxy
-         * @return this builder object
-         */
-        public Builder setOutboundProxy(String outboundProxy) {
-            mProxyAddress = outboundProxy;
-            return this;
-        }
-
-        /**
-         * Sets the display name of the user.
-         *
-         * @param displayName display name of the user
-         * @return this builder object
-         */
-        public Builder setDisplayName(String displayName) {
-            mDisplayName = displayName;
-            return this;
-        }
-
-        /**
-         * Sets the send keep-alive flag.
-         *
-         * @param flag true if sending keep-alive message is required,
-         *      false otherwise
-         * @return this builder object
-         */
-        public Builder setSendKeepAlive(boolean flag) {
-            mProfile.mSendKeepAlive = flag;
-            return this;
-        }
-
-
-        /**
-         * Sets the auto. registration flag.
-         *
-         * @param flag true if the profile will be registered automatically,
-         *      false otherwise
-         * @return this builder object
-         */
-        public Builder setAutoRegistration(boolean flag) {
-            mProfile.mAutoRegistration = flag;
-            return this;
-        }
-
-        /**
-         * Builds and returns the SIP profile object.
-         *
-         * @return the profile object created
-         */
-        public SipProfile build() {
-            // remove password from URI
-            mProfile.mPassword = mUri.getUserPassword();
-            mUri.setUserPassword(null);
-            try {
-                if (!TextUtils.isEmpty(mProxyAddress)) {
-                    SipURI uri = (SipURI)
-                            mAddressFactory.createURI(fix(mProxyAddress));
-                    mProfile.mProxyAddress = uri.getHost();
-                } else {
-                    if (!mProfile.mProtocol.equals(UDP)) {
-                        mUri.setTransportParam(mProfile.mProtocol);
-                    }
-                    if (mProfile.mPort != DEFAULT_PORT) {
-                        mUri.setPort(mProfile.mPort);
-                    }
-                }
-                mProfile.mAddress = mAddressFactory.createAddress(
-                        mDisplayName, mUri);
-            } catch (InvalidArgumentException e) {
-                throw new RuntimeException(e);
-            } catch (ParseException e) {
-                // must not occur
-                throw new RuntimeException(e);
-            }
-            return mProfile;
-        }
-    }
-
-    private SipProfile() {
-    }
-
-    private SipProfile(Parcel in) {
-        mAddress = (Address) in.readSerializable();
-        mProxyAddress = in.readString();
-        mPassword = in.readString();
-        mDomain = in.readString();
-        mProtocol = in.readString();
-        mProfileName = in.readString();
-        mSendKeepAlive = (in.readInt() == 0) ? false : true;
-        mAutoRegistration = (in.readInt() == 0) ? false : true;
-        mCallingUid = in.readInt();
-        mPort = in.readInt();
-        mAuthUserName = in.readString();
-    }
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeSerializable(mAddress);
-        out.writeString(mProxyAddress);
-        out.writeString(mPassword);
-        out.writeString(mDomain);
-        out.writeString(mProtocol);
-        out.writeString(mProfileName);
-        out.writeInt(mSendKeepAlive ? 1 : 0);
-        out.writeInt(mAutoRegistration ? 1 : 0);
-        out.writeInt(mCallingUid);
-        out.writeInt(mPort);
-        out.writeString(mAuthUserName);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    /**
-     * Gets the SIP URI of this profile.
-     *
-     * @return the SIP URI of this profile
-     * @hide
-     */
-    public SipURI getUri() {
-        return (SipURI) mAddress.getURI();
-    }
-
-    /**
-     * Gets the SIP URI string of this profile.
-     *
-     * @return the SIP URI string of this profile
-     */
-    public String getUriString() {
-        // We need to return the sip uri domain instead of
-        // the SIP URI with transport, port information if
-        // the outbound proxy address exists.
-        if (!TextUtils.isEmpty(mProxyAddress)) {
-            return "sip:" + getUserName() + "@" + mDomain;
-        }
-        return getUri().toString();
-    }
-
-    /**
-     * Gets the SIP address of this profile.
-     *
-     * @return the SIP address of this profile
-     * @hide
-     */
-    public Address getSipAddress() {
-        return mAddress;
-    }
-
-    /**
-     * Gets the display name of the user.
-     *
-     * @return the display name of the user
-     */
-    public String getDisplayName() {
-        return mAddress.getDisplayName();
-    }
-
-    /**
-     * Gets the username.
-     *
-     * @return the username
-     */
-    public String getUserName() {
-        return getUri().getUser();
-    }
-
-    /**
-     * Gets the username for authentication. If it is null, then the username
-     * is used in authentication instead.
-     *
-     * @return the authentication username
-     * @see #getUserName
-     */
-    public String getAuthUserName() {
-        return mAuthUserName;
-    }
-
-    /**
-     * Gets the password.
-     *
-     * @return the password
-     */
-    public String getPassword() {
-        return mPassword;
-    }
-
-    /**
-     * Gets the SIP domain.
-     *
-     * @return the SIP domain
-     */
-    public String getSipDomain() {
-        return mDomain;
-    }
-
-    /**
-     * Gets the port number of the SIP server.
-     *
-     * @return the port number of the SIP server
-     */
-    public int getPort() {
-        return mPort;
-    }
-
-    /**
-     * Gets the protocol used to connect to the server.
-     *
-     * @return the protocol
-     */
-    public String getProtocol() {
-        return mProtocol;
-    }
-
-    /**
-     * Gets the network address of the server outbound proxy.
-     *
-     * @return the network address of the server outbound proxy
-     */
-    public String getProxyAddress() {
-        return mProxyAddress;
-    }
-
-    /**
-     * Gets the (user-defined) name of the profile.
-     *
-     * @return name of the profile
-     */
-    public String getProfileName() {
-        return mProfileName;
-    }
-
-    /**
-     * Gets the flag of 'Sending keep-alive'.
-     *
-     * @return the flag of sending SIP keep-alive messages.
-     */
-    public boolean getSendKeepAlive() {
-        return mSendKeepAlive;
-    }
-
-    /**
-     * Gets the flag of 'Auto Registration'.
-     *
-     * @return the flag of registering the profile automatically.
-     */
-    public boolean getAutoRegistration() {
-        return mAutoRegistration;
-    }
-
-    /**
-     * Sets the calling process's Uid in the sip service.
-     * @hide
-     */
-    public void setCallingUid(int uid) {
-        mCallingUid = uid;
-    }
-
-    /**
-     * Gets the calling process's Uid in the sip settings.
-     * @hide
-     */
-    public int getCallingUid() {
-        return mCallingUid;
-    }
-
-    private Object readResolve() throws ObjectStreamException {
-        // For compatibility.
-        if (mPort == 0) mPort = DEFAULT_PORT;
-        return this;
-    }
-}
diff --git a/voip/java/android/net/sip/SipRegistrationListener.java b/voip/java/android/net/sip/SipRegistrationListener.java
deleted file mode 100644
index 9968cc7..0000000
--- a/voip/java/android/net/sip/SipRegistrationListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-/**
- * Listener for SIP registration events.
- */
-public interface SipRegistrationListener {
-    /**
-     * Called when a registration request is sent.
-     *
-     * @param localProfileUri the URI string of the SIP profile to register with
-     */
-    void onRegistering(String localProfileUri);
-
-    /**
-     * Called when the registration succeeded.
-     *
-     * @param localProfileUri the URI string of the SIP profile to register with
-     * @param expiryTime duration in seconds before the registration expires
-     */
-    void onRegistrationDone(String localProfileUri, long expiryTime);
-
-    /**
-     * Called when the registration failed.
-     *
-     * @param localProfileUri the URI string of the SIP profile to register with
-     * @param errorCode error code of this error
-     * @param errorMessage error message
-     * @see SipErrorCode
-     */
-    void onRegistrationFailed(String localProfileUri, int errorCode,
-            String errorMessage);
-}
diff --git a/voip/java/android/net/sip/SipSession.java b/voip/java/android/net/sip/SipSession.java
deleted file mode 100644
index e03cf9f..0000000
--- a/voip/java/android/net/sip/SipSession.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * Represents a SIP session that is associated with a SIP dialog or a standalone
- * transaction not within a dialog.
- * <p>You can get a {@link SipSession} from {@link SipManager} with {@link
- * SipManager#createSipSession createSipSession()} (when initiating calls) or {@link
- * SipManager#getSessionFor getSessionFor()} (when receiving calls).</p>
- */
-public final class SipSession {
-    private static final String TAG = "SipSession";
-
-    /**
-     * Defines SIP session states, such as "registering", "outgoing call", and "in call".
-     */
-    public static class State {
-        /** When session is ready to initiate a call or transaction. */
-        public static final int READY_TO_CALL = 0;
-
-        /** When the registration request is sent out. */
-        public static final int REGISTERING = 1;
-
-        /** When the unregistration request is sent out. */
-        public static final int DEREGISTERING = 2;
-
-        /** When an INVITE request is received. */
-        public static final int INCOMING_CALL = 3;
-
-        /** When an OK response is sent for the INVITE request received. */
-        public static final int INCOMING_CALL_ANSWERING = 4;
-
-        /** When an INVITE request is sent. */
-        public static final int OUTGOING_CALL = 5;
-
-        /** When a RINGING response is received for the INVITE request sent. */
-        public static final int OUTGOING_CALL_RING_BACK = 6;
-
-        /** When a CANCEL request is sent for the INVITE request sent. */
-        public static final int OUTGOING_CALL_CANCELING = 7;
-
-        /** When a call is established. */
-        public static final int IN_CALL = 8;
-
-        /** When an OPTIONS request is sent. */
-        public static final int PINGING = 9;
-
-        /** When ending a call. @hide */
-        public static final int ENDING_CALL = 10;
-
-        /** Not defined. */
-        public static final int NOT_DEFINED = 101;
-
-        /**
-         * Converts the state to string.
-         */
-        public static String toString(int state) {
-            switch (state) {
-                case READY_TO_CALL:
-                    return "READY_TO_CALL";
-                case REGISTERING:
-                    return "REGISTERING";
-                case DEREGISTERING:
-                    return "DEREGISTERING";
-                case INCOMING_CALL:
-                    return "INCOMING_CALL";
-                case INCOMING_CALL_ANSWERING:
-                    return "INCOMING_CALL_ANSWERING";
-                case OUTGOING_CALL:
-                    return "OUTGOING_CALL";
-                case OUTGOING_CALL_RING_BACK:
-                    return "OUTGOING_CALL_RING_BACK";
-                case OUTGOING_CALL_CANCELING:
-                    return "OUTGOING_CALL_CANCELING";
-                case IN_CALL:
-                    return "IN_CALL";
-                case PINGING:
-                    return "PINGING";
-                default:
-                    return "NOT_DEFINED";
-            }
-        }
-
-        private State() {
-        }
-    }
-
-    /**
-     * Listener for events relating to a SIP session, such as when a session is being registered
-     * ("on registering") or a call is outgoing ("on calling").
-     * <p>Many of these events are also received by {@link SipAudioCall.Listener}.</p>
-     */
-    public static class Listener {
-        /**
-         * Called when an INVITE request is sent to initiate a new call.
-         *
-         * @param session the session object that carries out the transaction
-         */
-        public void onCalling(SipSession session) {
-        }
-
-        /**
-         * Called when an INVITE request is received.
-         *
-         * @param session the session object that carries out the transaction
-         * @param caller the SIP profile of the caller
-         * @param sessionDescription the caller's session description
-         */
-        public void onRinging(SipSession session, SipProfile caller,
-                String sessionDescription) {
-        }
-
-        /**
-         * Called when a RINGING response is received for the INVITE request sent
-         *
-         * @param session the session object that carries out the transaction
-         */
-        public void onRingingBack(SipSession session) {
-        }
-
-        /**
-         * Called when the session is established.
-         *
-         * @param session the session object that is associated with the dialog
-         * @param sessionDescription the peer's session description
-         */
-        public void onCallEstablished(SipSession session,
-                String sessionDescription) {
-        }
-
-        /**
-         * Called when the session is terminated.
-         *
-         * @param session the session object that is associated with the dialog
-         */
-        public void onCallEnded(SipSession session) {
-        }
-
-        /**
-         * Called when the peer is busy during session initialization.
-         *
-         * @param session the session object that carries out the transaction
-         */
-        public void onCallBusy(SipSession session) {
-        }
-
-        /**
-         * Called when the call is being transferred to a new one.
-         *
-         * @hide
-         * @param newSession the new session that the call will be transferred to
-         * @param sessionDescription the new peer's session description
-         */
-        public void onCallTransferring(SipSession newSession,
-                String sessionDescription) {
-        }
-
-        /**
-         * Called when an error occurs during session initialization and
-         * termination.
-         *
-         * @param session the session object that carries out the transaction
-         * @param errorCode error code defined in {@link SipErrorCode}
-         * @param errorMessage error message
-         */
-        public void onError(SipSession session, int errorCode,
-                String errorMessage) {
-        }
-
-        /**
-         * Called when an error occurs during session modification negotiation.
-         *
-         * @param session the session object that carries out the transaction
-         * @param errorCode error code defined in {@link SipErrorCode}
-         * @param errorMessage error message
-         */
-        public void onCallChangeFailed(SipSession session, int errorCode,
-                String errorMessage) {
-        }
-
-        /**
-         * Called when a registration request is sent.
-         *
-         * @param session the session object that carries out the transaction
-         */
-        public void onRegistering(SipSession session) {
-        }
-
-        /**
-         * Called when registration is successfully done.
-         *
-         * @param session the session object that carries out the transaction
-         * @param duration duration in second before the registration expires
-         */
-        public void onRegistrationDone(SipSession session, int duration) {
-        }
-
-        /**
-         * Called when the registration fails.
-         *
-         * @param session the session object that carries out the transaction
-         * @param errorCode error code defined in {@link SipErrorCode}
-         * @param errorMessage error message
-         */
-        public void onRegistrationFailed(SipSession session, int errorCode,
-                String errorMessage) {
-        }
-
-        /**
-         * Called when the registration gets timed out.
-         *
-         * @param session the session object that carries out the transaction
-         */
-        public void onRegistrationTimeout(SipSession session) {
-        }
-    }
-
-    private final ISipSession mSession;
-    private Listener mListener;
-
-    SipSession(ISipSession realSession) {
-        mSession = realSession;
-        if (realSession != null) {
-            try {
-                realSession.setListener(createListener());
-            } catch (RemoteException e) {
-                Log.e(TAG, "SipSession.setListener(): " + e);
-            }
-        }
-    }
-
-    SipSession(ISipSession realSession, Listener listener) {
-        this(realSession);
-        setListener(listener);
-    }
-
-    /**
-     * Gets the IP address of the local host on which this SIP session runs.
-     *
-     * @return the IP address of the local host
-     */
-    public String getLocalIp() {
-        try {
-            return mSession.getLocalIp();
-        } catch (RemoteException e) {
-            Log.e(TAG, "getLocalIp(): " + e);
-            return "127.0.0.1";
-        }
-    }
-
-    /**
-     * Gets the SIP profile that this session is associated with.
-     *
-     * @return the SIP profile that this session is associated with
-     */
-    public SipProfile getLocalProfile() {
-        try {
-            return mSession.getLocalProfile();
-        } catch (RemoteException e) {
-            Log.e(TAG, "getLocalProfile(): " + e);
-            return null;
-        }
-    }
-
-    /**
-     * Gets the SIP profile that this session is connected to. Only available
-     * when the session is associated with a SIP dialog.
-     *
-     * @return the SIP profile that this session is connected to
-     */
-    public SipProfile getPeerProfile() {
-        try {
-            return mSession.getPeerProfile();
-        } catch (RemoteException e) {
-            Log.e(TAG, "getPeerProfile(): " + e);
-            return null;
-        }
-    }
-
-    /**
-     * Gets the session state. The value returned must be one of the states in
-     * {@link State}.
-     *
-     * @return the session state
-     */
-    public int getState() {
-        try {
-            return mSession.getState();
-        } catch (RemoteException e) {
-            Log.e(TAG, "getState(): " + e);
-            return State.NOT_DEFINED;
-        }
-    }
-
-    /**
-     * Checks if the session is in a call.
-     *
-     * @return true if the session is in a call
-     */
-    public boolean isInCall() {
-        try {
-            return mSession.isInCall();
-        } catch (RemoteException e) {
-            Log.e(TAG, "isInCall(): " + e);
-            return false;
-        }
-    }
-
-    /**
-     * Gets the call ID of the session.
-     *
-     * @return the call ID
-     */
-    public String getCallId() {
-        try {
-            return mSession.getCallId();
-        } catch (RemoteException e) {
-            Log.e(TAG, "getCallId(): " + e);
-            return null;
-        }
-    }
-
-
-    /**
-     * Sets the listener to listen to the session events. A {@code SipSession}
-     * can only hold one listener at a time. Subsequent calls to this method
-     * override the previous listener.
-     *
-     * @param listener to listen to the session events of this object
-     */
-    public void setListener(Listener listener) {
-        mListener = listener;
-    }
-
-
-    /**
-     * Performs registration to the server specified by the associated local
-     * profile. The session listener is called back upon success or failure of
-     * registration. The method is only valid to call when the session state is
-     * in {@link State#READY_TO_CALL}.
-     *
-     * @param duration duration in second before the registration expires
-     * @see Listener
-     */
-    public void register(int duration) {
-        try {
-            mSession.register(duration);
-        } catch (RemoteException e) {
-            Log.e(TAG, "register(): " + e);
-        }
-    }
-
-    /**
-     * Performs unregistration to the server specified by the associated local
-     * profile. Unregistration is technically the same as registration with zero
-     * expiration duration. The session listener is called back upon success or
-     * failure of unregistration. The method is only valid to call when the
-     * session state is in {@link State#READY_TO_CALL}.
-     *
-     * @see Listener
-     */
-    public void unregister() {
-        try {
-            mSession.unregister();
-        } catch (RemoteException e) {
-            Log.e(TAG, "unregister(): " + e);
-        }
-    }
-
-    /**
-     * Initiates a call to the specified profile. The session listener is called
-     * back upon defined session events. The method is only valid to call when
-     * the session state is in {@link State#READY_TO_CALL}.
-     *
-     * @param callee the SIP profile to make the call to
-     * @param sessionDescription the session description of this call
-     * @param timeout the session will be timed out if the call is not
-     *        established within {@code timeout} seconds. Default value (defined
-     *        by SIP protocol) is used if {@code timeout} is zero or negative.
-     * @see Listener
-     */
-    public void makeCall(SipProfile callee, String sessionDescription,
-            int timeout) {
-        try {
-            mSession.makeCall(callee, sessionDescription, timeout);
-        } catch (RemoteException e) {
-            Log.e(TAG, "makeCall(): " + e);
-        }
-    }
-
-    /**
-     * Answers an incoming call with the specified session description. The
-     * method is only valid to call when the session state is in
-     * {@link State#INCOMING_CALL}.
-     *
-     * @param sessionDescription the session description to answer this call
-     * @param timeout the session will be timed out if the call is not
-     *        established within {@code timeout} seconds. Default value (defined
-     *        by SIP protocol) is used if {@code timeout} is zero or negative.
-     */
-    public void answerCall(String sessionDescription, int timeout) {
-        try {
-            mSession.answerCall(sessionDescription, timeout);
-        } catch (RemoteException e) {
-            Log.e(TAG, "answerCall(): " + e);
-        }
-    }
-
-    /**
-     * Ends an established call, terminates an outgoing call or rejects an
-     * incoming call. The method is only valid to call when the session state is
-     * in {@link State#IN_CALL},
-     * {@link State#INCOMING_CALL},
-     * {@link State#OUTGOING_CALL} or
-     * {@link State#OUTGOING_CALL_RING_BACK}.
-     */
-    public void endCall() {
-        try {
-            mSession.endCall();
-        } catch (RemoteException e) {
-            Log.e(TAG, "endCall(): " + e);
-        }
-    }
-
-    /**
-     * Changes the session description during a call. The method is only valid
-     * to call when the session state is in {@link State#IN_CALL}.
-     *
-     * @param sessionDescription the new session description
-     * @param timeout the session will be timed out if the call is not
-     *        established within {@code timeout} seconds. Default value (defined
-     *        by SIP protocol) is used if {@code timeout} is zero or negative.
-     */
-    public void changeCall(String sessionDescription, int timeout) {
-        try {
-            mSession.changeCall(sessionDescription, timeout);
-        } catch (RemoteException e) {
-            Log.e(TAG, "changeCall(): " + e);
-        }
-    }
-
-    ISipSession getRealSession() {
-        return mSession;
-    }
-
-    private ISipSessionListener createListener() {
-        return new ISipSessionListener.Stub() {
-            public void onCalling(ISipSession session) {
-                if (mListener != null) {
-                    mListener.onCalling(SipSession.this);
-                }
-            }
-
-            public void onRinging(ISipSession session, SipProfile caller,
-                    String sessionDescription) {
-                if (mListener != null) {
-                    mListener.onRinging(SipSession.this, caller,
-                            sessionDescription);
-                }
-            }
-
-            public void onRingingBack(ISipSession session) {
-                if (mListener != null) {
-                    mListener.onRingingBack(SipSession.this);
-                }
-            }
-
-            public void onCallEstablished(ISipSession session,
-                    String sessionDescription) {
-                if (mListener != null) {
-                    mListener.onCallEstablished(SipSession.this,
-                            sessionDescription);
-                }
-            }
-
-            public void onCallEnded(ISipSession session) {
-                if (mListener != null) {
-                    mListener.onCallEnded(SipSession.this);
-                }
-            }
-
-            public void onCallBusy(ISipSession session) {
-                if (mListener != null) {
-                    mListener.onCallBusy(SipSession.this);
-                }
-            }
-
-            public void onCallTransferring(ISipSession session,
-                    String sessionDescription) {
-                if (mListener != null) {
-                    mListener.onCallTransferring(
-                            new SipSession(session, SipSession.this.mListener),
-                            sessionDescription);
-
-                }
-            }
-
-            public void onCallChangeFailed(ISipSession session, int errorCode,
-                    String message) {
-                if (mListener != null) {
-                    mListener.onCallChangeFailed(SipSession.this, errorCode,
-                            message);
-                }
-            }
-
-            public void onError(ISipSession session, int errorCode, String message) {
-                if (mListener != null) {
-                    mListener.onError(SipSession.this, errorCode, message);
-                }
-            }
-
-            public void onRegistering(ISipSession session) {
-                if (mListener != null) {
-                    mListener.onRegistering(SipSession.this);
-                }
-            }
-
-            public void onRegistrationDone(ISipSession session, int duration) {
-                if (mListener != null) {
-                    mListener.onRegistrationDone(SipSession.this, duration);
-                }
-            }
-
-            public void onRegistrationFailed(ISipSession session, int errorCode,
-                    String message) {
-                if (mListener != null) {
-                    mListener.onRegistrationFailed(SipSession.this, errorCode,
-                            message);
-                }
-            }
-
-            public void onRegistrationTimeout(ISipSession session) {
-                if (mListener != null) {
-                    mListener.onRegistrationTimeout(SipSession.this);
-                }
-            }
-        };
-    }
-}
diff --git a/voip/java/android/net/sip/SipSessionAdapter.java b/voip/java/android/net/sip/SipSessionAdapter.java
deleted file mode 100644
index f538983..0000000
--- a/voip/java/android/net/sip/SipSessionAdapter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.sip;
-
-/**
- * Adapter class for {@link ISipSessionListener}. Default implementation of all
- * callback methods is no-op.
- * @hide
- */
-public class SipSessionAdapter extends ISipSessionListener.Stub {
-    public void onCalling(ISipSession session) {
-    }
-
-    public void onRinging(ISipSession session, SipProfile caller,
-            String sessionDescription) {
-    }
-
-    public void onRingingBack(ISipSession session) {
-    }
-
-    public void onCallEstablished(ISipSession session,
-            String sessionDescription) {
-    }
-
-    public void onCallEnded(ISipSession session) {
-    }
-
-    public void onCallBusy(ISipSession session) {
-    }
-
-    public void onCallTransferring(ISipSession session,
-            String sessionDescription) {
-    }
-
-    public void onCallChangeFailed(ISipSession session, int errorCode,
-            String message) {
-    }
-
-    public void onError(ISipSession session, int errorCode, String message) {
-    }
-
-    public void onRegistering(ISipSession session) {
-    }
-
-    public void onRegistrationDone(ISipSession session, int duration) {
-    }
-
-    public void onRegistrationFailed(ISipSession session, int errorCode,
-            String message) {
-    }
-
-    public void onRegistrationTimeout(ISipSession session) {
-    }
-}
diff --git a/voip/java/android/net/sip/package.html b/voip/java/android/net/sip/package.html
deleted file mode 100644
index 3c4cc23..0000000
--- a/voip/java/android/net/sip/package.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<HTML>
-<BODY>
-<p>Provides access to Session Initiation Protocol (SIP) functionality, such as
-making and answering VOIP calls using SIP.</p>
-
-<p>For more information, see the
-<a href="{@docRoot}guide/topics/connectivity/sip.html">Session Initiation Protocol</a>
-developer guide.</p>
-{@more}
-
-<p>To get started, you need to get an instance of the {@link android.net.sip.SipManager} by
-calling {@link android.net.sip.SipManager#newInstance newInstance()}.</p>
-
-<p>With the {@link android.net.sip.SipManager}, you can initiate SIP audio calls with {@link
-android.net.sip.SipManager#makeAudioCall makeAudioCall()} and {@link
-android.net.sip.SipManager#takeAudioCall takeAudioCall()}. Both methods require
-a {@link android.net.sip.SipAudioCall.Listener} that receives callbacks when the state of the
-call changes, such as when the call is ringing, established, or ended.</p>
-
-<p>Both {@link android.net.sip.SipManager#makeAudioCall makeAudioCall()} also requires two
-{@link android.net.sip.SipProfile} objects, representing the local device and the peer
-device. You can create a {@link android.net.sip.SipProfile} using the {@link
-android.net.sip.SipProfile.Builder} subclass.</p>
-
-<p>Once you have a {@link android.net.sip.SipAudioCall}, you can perform SIP audio call actions with
-the instance, such as make a call, answer a call, mute a call, turn on speaker mode, send DTMF
-tones, and more.</p>
-
-<p>If you want to create generic SIP connections (such as for video calls or other), you can
-create a SIP connection from the {@link android.net.sip.SipManager}, using {@link
-android.net.sip.SipManager#open open()}. If you only want to create audio SIP calls, though, you
-should use the {@link android.net.sip.SipAudioCall} class, as described above.</p>
-
-<p class="note"><strong>Note:</strong>
-Not all Android-powered devices support VOIP functionality with SIP. Before performing any SIP
-activity, you should call {@link android.net.sip.SipManager#isVoipSupported isVoipSupported()}
-to verify that the device supports VOIP calling and {@link
-android.net.sip.SipManager#isApiSupported isApiSupported()} to verify that the device supports the
-SIP APIs.
-Your application must also request the {@link android.Manifest.permission#INTERNET} and {@link
-android.Manifest.permission#USE_SIP} permissions in order to use the SIP APIs.
-</p>
-
-</BODY>
-</HTML>
\ No newline at end of file
diff --git a/voip/java/com/android/server/sip/SipHelper.java b/voip/java/com/android/server/sip/SipHelper.java
deleted file mode 100644
index 113f007..0000000
--- a/voip/java/com/android/server/sip/SipHelper.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * Copyright (C) 2010 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.server.sip;
-
-import gov.nist.javax.sip.SipStackExt;
-import gov.nist.javax.sip.clientauthutils.AccountManager;
-import gov.nist.javax.sip.clientauthutils.AuthenticationHelper;
-import gov.nist.javax.sip.header.extensions.ReferencesHeader;
-import gov.nist.javax.sip.header.extensions.ReferredByHeader;
-import gov.nist.javax.sip.header.extensions.ReplacesHeader;
-
-import android.net.sip.SipProfile;
-import android.util.Log;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.EventObject;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.sip.ClientTransaction;
-import javax.sip.Dialog;
-import javax.sip.DialogTerminatedEvent;
-import javax.sip.InvalidArgumentException;
-import javax.sip.ListeningPoint;
-import javax.sip.PeerUnavailableException;
-import javax.sip.RequestEvent;
-import javax.sip.ResponseEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipException;
-import javax.sip.SipFactory;
-import javax.sip.SipProvider;
-import javax.sip.SipStack;
-import javax.sip.Transaction;
-import javax.sip.TransactionAlreadyExistsException;
-import javax.sip.TransactionTerminatedEvent;
-import javax.sip.TransactionUnavailableException;
-import javax.sip.TransactionState;
-import javax.sip.address.Address;
-import javax.sip.address.AddressFactory;
-import javax.sip.address.SipURI;
-import javax.sip.header.CSeqHeader;
-import javax.sip.header.CallIdHeader;
-import javax.sip.header.ContactHeader;
-import javax.sip.header.FromHeader;
-import javax.sip.header.Header;
-import javax.sip.header.HeaderFactory;
-import javax.sip.header.MaxForwardsHeader;
-import javax.sip.header.ToHeader;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.Message;
-import javax.sip.message.MessageFactory;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-/**
- * Helper class for holding SIP stack related classes and for various low-level
- * SIP tasks like sending messages.
- */
-class SipHelper {
-    private static final String TAG = SipHelper.class.getSimpleName();
-    private static final boolean DEBUG = false;
-    private static final boolean DEBUG_PING = false;
-
-    private SipStack mSipStack;
-    private SipProvider mSipProvider;
-    private AddressFactory mAddressFactory;
-    private HeaderFactory mHeaderFactory;
-    private MessageFactory mMessageFactory;
-
-    public SipHelper(SipStack sipStack, SipProvider sipProvider)
-            throws PeerUnavailableException {
-        mSipStack = sipStack;
-        mSipProvider = sipProvider;
-
-        SipFactory sipFactory = SipFactory.getInstance();
-        mAddressFactory = sipFactory.createAddressFactory();
-        mHeaderFactory = sipFactory.createHeaderFactory();
-        mMessageFactory = sipFactory.createMessageFactory();
-    }
-
-    private FromHeader createFromHeader(SipProfile profile, String tag)
-            throws ParseException {
-        return mHeaderFactory.createFromHeader(profile.getSipAddress(), tag);
-    }
-
-    private ToHeader createToHeader(SipProfile profile) throws ParseException {
-        return createToHeader(profile, null);
-    }
-
-    private ToHeader createToHeader(SipProfile profile, String tag)
-            throws ParseException {
-        return mHeaderFactory.createToHeader(profile.getSipAddress(), tag);
-    }
-
-    private CallIdHeader createCallIdHeader() {
-        return mSipProvider.getNewCallId();
-    }
-
-    private CSeqHeader createCSeqHeader(String method)
-            throws ParseException, InvalidArgumentException {
-        long sequence = (long) (Math.random() * 10000);
-        return mHeaderFactory.createCSeqHeader(sequence, method);
-    }
-
-    private MaxForwardsHeader createMaxForwardsHeader()
-            throws InvalidArgumentException {
-        return mHeaderFactory.createMaxForwardsHeader(70);
-    }
-
-    private MaxForwardsHeader createMaxForwardsHeader(int max)
-            throws InvalidArgumentException {
-        return mHeaderFactory.createMaxForwardsHeader(max);
-    }
-
-    private ListeningPoint getListeningPoint() throws SipException {
-        ListeningPoint lp = mSipProvider.getListeningPoint(ListeningPoint.UDP);
-        if (lp == null) lp = mSipProvider.getListeningPoint(ListeningPoint.TCP);
-        if (lp == null) {
-            ListeningPoint[] lps = mSipProvider.getListeningPoints();
-            if ((lps != null) && (lps.length > 0)) lp = lps[0];
-        }
-        if (lp == null) {
-            throw new SipException("no listening point is available");
-        }
-        return lp;
-    }
-
-    private List<ViaHeader> createViaHeaders()
-            throws ParseException, SipException {
-        List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(1);
-        ListeningPoint lp = getListeningPoint();
-        ViaHeader viaHeader = mHeaderFactory.createViaHeader(lp.getIPAddress(),
-                lp.getPort(), lp.getTransport(), null);
-        viaHeader.setRPort();
-        viaHeaders.add(viaHeader);
-        return viaHeaders;
-    }
-
-    private ContactHeader createContactHeader(SipProfile profile)
-            throws ParseException, SipException {
-        return createContactHeader(profile, null, 0);
-    }
-
-    private ContactHeader createContactHeader(SipProfile profile,
-            String ip, int port) throws ParseException,
-            SipException {
-        SipURI contactURI = (ip == null)
-                ? createSipUri(profile.getUserName(), profile.getProtocol(),
-                        getListeningPoint())
-                : createSipUri(profile.getUserName(), profile.getProtocol(),
-                        ip, port);
-
-        Address contactAddress = mAddressFactory.createAddress(contactURI);
-        contactAddress.setDisplayName(profile.getDisplayName());
-
-        return mHeaderFactory.createContactHeader(contactAddress);
-    }
-
-    private ContactHeader createWildcardContactHeader() {
-        ContactHeader contactHeader  = mHeaderFactory.createContactHeader();
-        contactHeader.setWildCard();
-        return contactHeader;
-    }
-
-    private SipURI createSipUri(String username, String transport,
-            ListeningPoint lp) throws ParseException {
-        return createSipUri(username, transport, lp.getIPAddress(), lp.getPort());
-    }
-
-    private SipURI createSipUri(String username, String transport,
-            String ip, int port) throws ParseException {
-        SipURI uri = mAddressFactory.createSipURI(username, ip);
-        try {
-            uri.setPort(port);
-            uri.setTransportParam(transport);
-        } catch (InvalidArgumentException e) {
-            throw new RuntimeException(e);
-        }
-        return uri;
-    }
-
-    public ClientTransaction sendOptions(SipProfile caller, SipProfile callee,
-            String tag) throws SipException {
-        try {
-            Request request = (caller == callee)
-                    ? createRequest(Request.OPTIONS, caller, tag)
-                    : createRequest(Request.OPTIONS, caller, callee, tag);
-
-            ClientTransaction clientTransaction =
-                    mSipProvider.getNewClientTransaction(request);
-            clientTransaction.sendRequest();
-            return clientTransaction;
-        } catch (Exception e) {
-            throw new SipException("sendOptions()", e);
-        }
-    }
-
-    public ClientTransaction sendRegister(SipProfile userProfile, String tag,
-            int expiry) throws SipException {
-        try {
-            Request request = createRequest(Request.REGISTER, userProfile, tag);
-            if (expiry == 0) {
-                // remove all previous registrations by wildcard
-                // rfc3261#section-10.2.2
-                request.addHeader(createWildcardContactHeader());
-            } else {
-                request.addHeader(createContactHeader(userProfile));
-            }
-            request.addHeader(mHeaderFactory.createExpiresHeader(expiry));
-
-            ClientTransaction clientTransaction =
-                    mSipProvider.getNewClientTransaction(request);
-            clientTransaction.sendRequest();
-            return clientTransaction;
-        } catch (ParseException e) {
-            throw new SipException("sendRegister()", e);
-        }
-    }
-
-    private Request createRequest(String requestType, SipProfile userProfile,
-            String tag) throws ParseException, SipException {
-        FromHeader fromHeader = createFromHeader(userProfile, tag);
-        ToHeader toHeader = createToHeader(userProfile);
-
-        String replaceStr = Pattern.quote(userProfile.getUserName() + "@");
-        SipURI requestURI = mAddressFactory.createSipURI(
-                userProfile.getUriString().replaceFirst(replaceStr, ""));
-
-        List<ViaHeader> viaHeaders = createViaHeaders();
-        CallIdHeader callIdHeader = createCallIdHeader();
-        CSeqHeader cSeqHeader = createCSeqHeader(requestType);
-        MaxForwardsHeader maxForwards = createMaxForwardsHeader();
-        Request request = mMessageFactory.createRequest(requestURI,
-                requestType, callIdHeader, cSeqHeader, fromHeader,
-                toHeader, viaHeaders, maxForwards);
-        Header userAgentHeader = mHeaderFactory.createHeader("User-Agent",
-                "SIPAUA/0.1.001");
-        request.addHeader(userAgentHeader);
-        return request;
-    }
-
-    public ClientTransaction handleChallenge(ResponseEvent responseEvent,
-            AccountManager accountManager) throws SipException {
-        AuthenticationHelper authenticationHelper =
-                ((SipStackExt) mSipStack).getAuthenticationHelper(
-                        accountManager, mHeaderFactory);
-        ClientTransaction tid = responseEvent.getClientTransaction();
-        ClientTransaction ct = authenticationHelper.handleChallenge(
-                responseEvent.getResponse(), tid, mSipProvider, 5);
-        if (DEBUG) Log.d(TAG, "send request with challenge response: "
-                + ct.getRequest());
-        ct.sendRequest();
-        return ct;
-    }
-
-    private Request createRequest(String requestType, SipProfile caller,
-            SipProfile callee, String tag) throws ParseException, SipException {
-        FromHeader fromHeader = createFromHeader(caller, tag);
-        ToHeader toHeader = createToHeader(callee);
-        SipURI requestURI = callee.getUri();
-        List<ViaHeader> viaHeaders = createViaHeaders();
-        CallIdHeader callIdHeader = createCallIdHeader();
-        CSeqHeader cSeqHeader = createCSeqHeader(requestType);
-        MaxForwardsHeader maxForwards = createMaxForwardsHeader();
-
-        Request request = mMessageFactory.createRequest(requestURI,
-                requestType, callIdHeader, cSeqHeader, fromHeader,
-                toHeader, viaHeaders, maxForwards);
-
-        request.addHeader(createContactHeader(caller));
-        return request;
-    }
-
-    public ClientTransaction sendInvite(SipProfile caller, SipProfile callee,
-            String sessionDescription, String tag, ReferredByHeader referredBy,
-            String replaces) throws SipException {
-        try {
-            Request request = createRequest(Request.INVITE, caller, callee, tag);
-            if (referredBy != null) request.addHeader(referredBy);
-            if (replaces != null) {
-                request.addHeader(mHeaderFactory.createHeader(
-                        ReplacesHeader.NAME, replaces));
-            }
-            request.setContent(sessionDescription,
-                    mHeaderFactory.createContentTypeHeader(
-                            "application", "sdp"));
-            ClientTransaction clientTransaction =
-                    mSipProvider.getNewClientTransaction(request);
-            if (DEBUG) Log.d(TAG, "send INVITE: " + request);
-            clientTransaction.sendRequest();
-            return clientTransaction;
-        } catch (ParseException e) {
-            throw new SipException("sendInvite()", e);
-        }
-    }
-
-    public ClientTransaction sendReinvite(Dialog dialog,
-            String sessionDescription) throws SipException {
-        try {
-            Request request = dialog.createRequest(Request.INVITE);
-            request.setContent(sessionDescription,
-                    mHeaderFactory.createContentTypeHeader(
-                            "application", "sdp"));
-
-            // Adding rport argument in the request could fix some SIP servers
-            // in resolving the initiator's NAT port mapping for relaying the
-            // response message from the other end.
-
-            ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
-            if (viaHeader != null) viaHeader.setRPort();
-
-            ClientTransaction clientTransaction =
-                    mSipProvider.getNewClientTransaction(request);
-            if (DEBUG) Log.d(TAG, "send RE-INVITE: " + request);
-            dialog.sendRequest(clientTransaction);
-            return clientTransaction;
-        } catch (ParseException e) {
-            throw new SipException("sendReinvite()", e);
-        }
-    }
-
-    public ServerTransaction getServerTransaction(RequestEvent event)
-            throws SipException {
-        ServerTransaction transaction = event.getServerTransaction();
-        if (transaction == null) {
-            Request request = event.getRequest();
-            return mSipProvider.getNewServerTransaction(request);
-        } else {
-            return transaction;
-        }
-    }
-
-    /**
-     * @param event the INVITE request event
-     */
-    public ServerTransaction sendRinging(RequestEvent event, String tag)
-            throws SipException {
-        try {
-            Request request = event.getRequest();
-            ServerTransaction transaction = getServerTransaction(event);
-
-            Response response = mMessageFactory.createResponse(Response.RINGING,
-                    request);
-
-            ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME);
-            toHeader.setTag(tag);
-            response.addHeader(toHeader);
-            if (DEBUG) Log.d(TAG, "send RINGING: " + response);
-            transaction.sendResponse(response);
-            return transaction;
-        } catch (ParseException e) {
-            throw new SipException("sendRinging()", e);
-        }
-    }
-
-    /**
-     * @param event the INVITE request event
-     */
-    public ServerTransaction sendInviteOk(RequestEvent event,
-            SipProfile localProfile, String sessionDescription,
-            ServerTransaction inviteTransaction, String externalIp,
-            int externalPort) throws SipException {
-        try {
-            Request request = event.getRequest();
-            Response response = mMessageFactory.createResponse(Response.OK,
-                    request);
-            response.addHeader(createContactHeader(localProfile, externalIp,
-                    externalPort));
-            response.setContent(sessionDescription,
-                    mHeaderFactory.createContentTypeHeader(
-                            "application", "sdp"));
-
-            if (inviteTransaction == null) {
-                inviteTransaction = getServerTransaction(event);
-            }
-
-            if (inviteTransaction.getState() != TransactionState.COMPLETED) {
-                if (DEBUG) Log.d(TAG, "send OK: " + response);
-                inviteTransaction.sendResponse(response);
-            }
-
-            return inviteTransaction;
-        } catch (ParseException e) {
-            throw new SipException("sendInviteOk()", e);
-        }
-    }
-
-    public void sendInviteBusyHere(RequestEvent event,
-            ServerTransaction inviteTransaction) throws SipException {
-        try {
-            Request request = event.getRequest();
-            Response response = mMessageFactory.createResponse(
-                    Response.BUSY_HERE, request);
-
-            if (inviteTransaction == null) {
-                inviteTransaction = getServerTransaction(event);
-            }
-
-            if (inviteTransaction.getState() != TransactionState.COMPLETED) {
-                if (DEBUG) Log.d(TAG, "send BUSY HERE: " + response);
-                inviteTransaction.sendResponse(response);
-            }
-        } catch (ParseException e) {
-            throw new SipException("sendInviteBusyHere()", e);
-        }
-    }
-
-    /**
-     * @param event the INVITE ACK request event
-     */
-    public void sendInviteAck(ResponseEvent event, Dialog dialog)
-            throws SipException {
-        Response response = event.getResponse();
-        long cseq = ((CSeqHeader) response.getHeader(CSeqHeader.NAME))
-                .getSeqNumber();
-        Request ack = dialog.createAck(cseq);
-        if (DEBUG) Log.d(TAG, "send ACK: " + ack);
-        dialog.sendAck(ack);
-    }
-
-    public void sendBye(Dialog dialog) throws SipException {
-        Request byeRequest = dialog.createRequest(Request.BYE);
-        if (DEBUG) Log.d(TAG, "send BYE: " + byeRequest);
-        dialog.sendRequest(mSipProvider.getNewClientTransaction(byeRequest));
-    }
-
-    public void sendCancel(ClientTransaction inviteTransaction)
-            throws SipException {
-        Request cancelRequest = inviteTransaction.createCancel();
-        if (DEBUG) Log.d(TAG, "send CANCEL: " + cancelRequest);
-        mSipProvider.getNewClientTransaction(cancelRequest).sendRequest();
-    }
-
-    public void sendResponse(RequestEvent event, int responseCode)
-            throws SipException {
-        try {
-            Request request = event.getRequest();
-            Response response = mMessageFactory.createResponse(
-                    responseCode, request);
-            if (DEBUG && (!Request.OPTIONS.equals(request.getMethod())
-                    || DEBUG_PING)) {
-                Log.d(TAG, "send response: " + response);
-            }
-            getServerTransaction(event).sendResponse(response);
-        } catch (ParseException e) {
-            throw new SipException("sendResponse()", e);
-        }
-    }
-
-    public void sendReferNotify(Dialog dialog, String content)
-            throws SipException {
-        try {
-            Request request = dialog.createRequest(Request.NOTIFY);
-            request.addHeader(mHeaderFactory.createSubscriptionStateHeader(
-                    "active;expires=60"));
-            // set content here
-            request.setContent(content,
-                    mHeaderFactory.createContentTypeHeader(
-                            "message", "sipfrag"));
-            request.addHeader(mHeaderFactory.createEventHeader(
-                    ReferencesHeader.REFER));
-            if (DEBUG) Log.d(TAG, "send NOTIFY: " + request);
-            dialog.sendRequest(mSipProvider.getNewClientTransaction(request));
-        } catch (ParseException e) {
-            throw new SipException("sendReferNotify()", e);
-        }
-    }
-
-    public void sendInviteRequestTerminated(Request inviteRequest,
-            ServerTransaction inviteTransaction) throws SipException {
-        try {
-            Response response = mMessageFactory.createResponse(
-                    Response.REQUEST_TERMINATED, inviteRequest);
-            if (DEBUG) Log.d(TAG, "send response: " + response);
-            inviteTransaction.sendResponse(response);
-        } catch (ParseException e) {
-            throw new SipException("sendInviteRequestTerminated()", e);
-        }
-    }
-
-    public static String getCallId(EventObject event) {
-        if (event == null) return null;
-        if (event instanceof RequestEvent) {
-            return getCallId(((RequestEvent) event).getRequest());
-        } else if (event instanceof ResponseEvent) {
-            return getCallId(((ResponseEvent) event).getResponse());
-        } else if (event instanceof DialogTerminatedEvent) {
-            Dialog dialog = ((DialogTerminatedEvent) event).getDialog();
-            return getCallId(((DialogTerminatedEvent) event).getDialog());
-        } else if (event instanceof TransactionTerminatedEvent) {
-            TransactionTerminatedEvent e = (TransactionTerminatedEvent) event;
-            return getCallId(e.isServerTransaction()
-                    ? e.getServerTransaction()
-                    : e.getClientTransaction());
-        } else {
-            Object source = event.getSource();
-            if (source instanceof Transaction) {
-                return getCallId(((Transaction) source));
-            } else if (source instanceof Dialog) {
-                return getCallId((Dialog) source);
-            }
-        }
-        return "";
-    }
-
-    public static String getCallId(Transaction transaction) {
-        return ((transaction != null) ? getCallId(transaction.getRequest())
-                                      : "");
-    }
-
-    private static String getCallId(Message message) {
-        CallIdHeader callIdHeader =
-                (CallIdHeader) message.getHeader(CallIdHeader.NAME);
-        return callIdHeader.getCallId();
-    }
-
-    private static String getCallId(Dialog dialog) {
-        return dialog.getCallId().getCallId();
-    }
-}
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java
deleted file mode 100644
index a477fd1..0000000
--- a/voip/java/com/android/server/sip/SipService.java
+++ /dev/null
@@ -1,1203 +0,0 @@
-/*
- * Copyright (C) 2010, 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.server.sip;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.sip.ISipService;
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipErrorCode;
-import android.net.sip.SipManager;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSession;
-import android.net.sip.SipSessionAdapter;
-import android.net.wifi.WifiManager;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeSet;
-import java.util.concurrent.Executor;
-import javax.sip.SipException;
-
-/**
- * @hide
- */
-public final class SipService extends ISipService.Stub {
-    static final String TAG = "SipService";
-    static final boolean DEBUG = false;
-    private static final int EXPIRY_TIME = 3600;
-    private static final int SHORT_EXPIRY_TIME = 10;
-    private static final int MIN_EXPIRY_TIME = 60;
-    private static final int DEFAULT_KEEPALIVE_INTERVAL = 10; // in seconds
-    private static final int DEFAULT_MAX_KEEPALIVE_INTERVAL = 120; // in seconds
-
-    private Context mContext;
-    private String mLocalIp;
-    private int mNetworkType = -1;
-    private SipWakeupTimer mTimer;
-    private WifiManager.WifiLock mWifiLock;
-    private boolean mSipOnWifiOnly;
-
-    private IntervalMeasurementProcess mIntervalMeasurementProcess;
-
-    private MyExecutor mExecutor = new MyExecutor();
-
-    // SipProfile URI --> group
-    private Map<String, SipSessionGroupExt> mSipGroups =
-            new HashMap<String, SipSessionGroupExt>();
-
-    // session ID --> session
-    private Map<String, ISipSession> mPendingSessions =
-            new HashMap<String, ISipSession>();
-
-    private ConnectivityReceiver mConnectivityReceiver;
-    private SipWakeLock mMyWakeLock;
-    private int mKeepAliveInterval;
-    private int mLastGoodKeepAliveInterval = DEFAULT_KEEPALIVE_INTERVAL;
-
-    /**
-     * Starts the SIP service. Do nothing if the SIP API is not supported on the
-     * device.
-     */
-    public static void start(Context context) {
-        if (SipManager.isApiSupported(context)) {
-            ServiceManager.addService("sip", new SipService(context));
-            context.sendBroadcast(new Intent(SipManager.ACTION_SIP_SERVICE_UP));
-            if (DEBUG) Log.d(TAG, "SIP service started");
-        }
-    }
-
-    private SipService(Context context) {
-        if (DEBUG) Log.d(TAG, " service started!");
-        mContext = context;
-        mConnectivityReceiver = new ConnectivityReceiver();
-
-        mWifiLock = ((WifiManager)
-                context.getSystemService(Context.WIFI_SERVICE))
-                .createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);
-        mWifiLock.setReferenceCounted(false);
-        mSipOnWifiOnly = SipManager.isSipWifiOnly(context);
-
-        mMyWakeLock = new SipWakeLock((PowerManager)
-                context.getSystemService(Context.POWER_SERVICE));
-
-        mTimer = new SipWakeupTimer(context, mExecutor);
-    }
-
-    public synchronized SipProfile[] getListOfProfiles() {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        boolean isCallerRadio = isCallerRadio();
-        ArrayList<SipProfile> profiles = new ArrayList<SipProfile>();
-        for (SipSessionGroupExt group : mSipGroups.values()) {
-            if (isCallerRadio || isCallerCreator(group)) {
-                profiles.add(group.getLocalProfile());
-            }
-        }
-        return profiles.toArray(new SipProfile[profiles.size()]);
-    }
-
-    public synchronized void open(SipProfile localProfile) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        localProfile.setCallingUid(Binder.getCallingUid());
-        try {
-            createGroup(localProfile);
-        } catch (SipException e) {
-            Log.e(TAG, "openToMakeCalls()", e);
-            // TODO: how to send the exception back
-        }
-    }
-
-    public synchronized void open3(SipProfile localProfile,
-            PendingIntent incomingCallPendingIntent,
-            ISipSessionListener listener) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        localProfile.setCallingUid(Binder.getCallingUid());
-        if (incomingCallPendingIntent == null) {
-            Log.w(TAG, "incomingCallPendingIntent cannot be null; "
-                    + "the profile is not opened");
-            return;
-        }
-        if (DEBUG) Log.d(TAG, "open3: " + localProfile.getUriString() + ": "
-                + incomingCallPendingIntent + ": " + listener);
-        try {
-            SipSessionGroupExt group = createGroup(localProfile,
-                    incomingCallPendingIntent, listener);
-            if (localProfile.getAutoRegistration()) {
-                group.openToReceiveCalls();
-                updateWakeLocks();
-            }
-        } catch (SipException e) {
-            Log.e(TAG, "openToReceiveCalls()", e);
-            // TODO: how to send the exception back
-        }
-    }
-
-    private boolean isCallerCreator(SipSessionGroupExt group) {
-        SipProfile profile = group.getLocalProfile();
-        return (profile.getCallingUid() == Binder.getCallingUid());
-    }
-
-    private boolean isCallerCreatorOrRadio(SipSessionGroupExt group) {
-        return (isCallerRadio() || isCallerCreator(group));
-    }
-
-    private boolean isCallerRadio() {
-        return (Binder.getCallingUid() == Process.PHONE_UID);
-    }
-
-    public synchronized void close(String localProfileUri) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        SipSessionGroupExt group = mSipGroups.get(localProfileUri);
-        if (group == null) return;
-        if (!isCallerCreatorOrRadio(group)) {
-            Log.w(TAG, "only creator or radio can close this profile");
-            return;
-        }
-
-        group = mSipGroups.remove(localProfileUri);
-        notifyProfileRemoved(group.getLocalProfile());
-        group.close();
-
-        updateWakeLocks();
-    }
-
-    public synchronized boolean isOpened(String localProfileUri) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        SipSessionGroupExt group = mSipGroups.get(localProfileUri);
-        if (group == null) return false;
-        if (isCallerCreatorOrRadio(group)) {
-            return true;
-        } else {
-            Log.w(TAG, "only creator or radio can query on the profile");
-            return false;
-        }
-    }
-
-    public synchronized boolean isRegistered(String localProfileUri) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        SipSessionGroupExt group = mSipGroups.get(localProfileUri);
-        if (group == null) return false;
-        if (isCallerCreatorOrRadio(group)) {
-            return group.isRegistered();
-        } else {
-            Log.w(TAG, "only creator or radio can query on the profile");
-            return false;
-        }
-    }
-
-    public synchronized void setRegistrationListener(String localProfileUri,
-            ISipSessionListener listener) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        SipSessionGroupExt group = mSipGroups.get(localProfileUri);
-        if (group == null) return;
-        if (isCallerCreator(group)) {
-            group.setListener(listener);
-        } else {
-            Log.w(TAG, "only creator can set listener on the profile");
-        }
-    }
-
-    public synchronized ISipSession createSession(SipProfile localProfile,
-            ISipSessionListener listener) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        localProfile.setCallingUid(Binder.getCallingUid());
-        if (mNetworkType == -1) return null;
-        try {
-            SipSessionGroupExt group = createGroup(localProfile);
-            return group.createSession(listener);
-        } catch (SipException e) {
-            if (DEBUG) Log.d(TAG, "createSession()", e);
-            return null;
-        }
-    }
-
-    public synchronized ISipSession getPendingSession(String callId) {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.USE_SIP, null);
-        if (callId == null) return null;
-        return mPendingSessions.get(callId);
-    }
-
-    private String determineLocalIp() {
-        try {
-            DatagramSocket s = new DatagramSocket();
-            s.connect(InetAddress.getByName("192.168.1.1"), 80);
-            return s.getLocalAddress().getHostAddress();
-        } catch (IOException e) {
-            if (DEBUG) Log.d(TAG, "determineLocalIp()", e);
-            // dont do anything; there should be a connectivity change going
-            return null;
-        }
-    }
-
-    private SipSessionGroupExt createGroup(SipProfile localProfile)
-            throws SipException {
-        String key = localProfile.getUriString();
-        SipSessionGroupExt group = mSipGroups.get(key);
-        if (group == null) {
-            group = new SipSessionGroupExt(localProfile, null, null);
-            mSipGroups.put(key, group);
-            notifyProfileAdded(localProfile);
-        } else if (!isCallerCreator(group)) {
-            throw new SipException("only creator can access the profile");
-        }
-        return group;
-    }
-
-    private SipSessionGroupExt createGroup(SipProfile localProfile,
-            PendingIntent incomingCallPendingIntent,
-            ISipSessionListener listener) throws SipException {
-        String key = localProfile.getUriString();
-        SipSessionGroupExt group = mSipGroups.get(key);
-        if (group != null) {
-            if (!isCallerCreator(group)) {
-                throw new SipException("only creator can access the profile");
-            }
-            group.setIncomingCallPendingIntent(incomingCallPendingIntent);
-            group.setListener(listener);
-        } else {
-            group = new SipSessionGroupExt(localProfile,
-                    incomingCallPendingIntent, listener);
-            mSipGroups.put(key, group);
-            notifyProfileAdded(localProfile);
-        }
-        return group;
-    }
-
-    private void notifyProfileAdded(SipProfile localProfile) {
-        if (DEBUG) Log.d(TAG, "notify: profile added: " + localProfile);
-        Intent intent = new Intent(SipManager.ACTION_SIP_ADD_PHONE);
-        intent.putExtra(SipManager.EXTRA_LOCAL_URI, localProfile.getUriString());
-        mContext.sendBroadcast(intent);
-        if (mSipGroups.size() == 1) {
-            registerReceivers();
-        }
-    }
-
-    private void notifyProfileRemoved(SipProfile localProfile) {
-        if (DEBUG) Log.d(TAG, "notify: profile removed: " + localProfile);
-        Intent intent = new Intent(SipManager.ACTION_SIP_REMOVE_PHONE);
-        intent.putExtra(SipManager.EXTRA_LOCAL_URI, localProfile.getUriString());
-        mContext.sendBroadcast(intent);
-        if (mSipGroups.size() == 0) {
-            unregisterReceivers();
-        }
-    }
-
-    private void stopPortMappingMeasurement() {
-        if (mIntervalMeasurementProcess != null) {
-            mIntervalMeasurementProcess.stop();
-            mIntervalMeasurementProcess = null;
-        }
-    }
-
-    private void startPortMappingLifetimeMeasurement(
-            SipProfile localProfile) {
-        startPortMappingLifetimeMeasurement(localProfile,
-                DEFAULT_MAX_KEEPALIVE_INTERVAL);
-    }
-
-    private void startPortMappingLifetimeMeasurement(
-            SipProfile localProfile, int maxInterval) {
-        if ((mIntervalMeasurementProcess == null)
-                && (mKeepAliveInterval == -1)
-                && isBehindNAT(mLocalIp)) {
-            Log.d(TAG, "start NAT port mapping timeout measurement on "
-                    + localProfile.getUriString());
-
-            int minInterval = mLastGoodKeepAliveInterval;
-            if (minInterval >= maxInterval) {
-                // If mLastGoodKeepAliveInterval also does not work, reset it
-                // to the default min
-                minInterval = mLastGoodKeepAliveInterval
-                        = DEFAULT_KEEPALIVE_INTERVAL;
-                Log.d(TAG, "  reset min interval to " + minInterval);
-            }
-            mIntervalMeasurementProcess = new IntervalMeasurementProcess(
-                    localProfile, minInterval, maxInterval);
-            mIntervalMeasurementProcess.start();
-        }
-    }
-
-    private void restartPortMappingLifetimeMeasurement(
-            SipProfile localProfile, int maxInterval) {
-        stopPortMappingMeasurement();
-        mKeepAliveInterval = -1;
-        startPortMappingLifetimeMeasurement(localProfile, maxInterval);
-    }
-
-    private synchronized void addPendingSession(ISipSession session) {
-        try {
-            cleanUpPendingSessions();
-            mPendingSessions.put(session.getCallId(), session);
-            if (DEBUG) Log.d(TAG, "#pending sess=" + mPendingSessions.size());
-        } catch (RemoteException e) {
-            // should not happen with a local call
-            Log.e(TAG, "addPendingSession()", e);
-        }
-    }
-
-    private void cleanUpPendingSessions() throws RemoteException {
-        Map.Entry<String, ISipSession>[] entries =
-                mPendingSessions.entrySet().toArray(
-                new Map.Entry[mPendingSessions.size()]);
-        for (Map.Entry<String, ISipSession> entry : entries) {
-            if (entry.getValue().getState() != SipSession.State.INCOMING_CALL) {
-                mPendingSessions.remove(entry.getKey());
-            }
-        }
-    }
-
-    private synchronized boolean callingSelf(SipSessionGroupExt ringingGroup,
-            SipSessionGroup.SipSessionImpl ringingSession) {
-        String callId = ringingSession.getCallId();
-        for (SipSessionGroupExt group : mSipGroups.values()) {
-            if ((group != ringingGroup) && group.containsSession(callId)) {
-                if (DEBUG) Log.d(TAG, "call self: "
-                        + ringingSession.getLocalProfile().getUriString()
-                        + " -> " + group.getLocalProfile().getUriString());
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private synchronized void onKeepAliveIntervalChanged() {
-        for (SipSessionGroupExt group : mSipGroups.values()) {
-            group.onKeepAliveIntervalChanged();
-        }
-    }
-
-    private int getKeepAliveInterval() {
-        return (mKeepAliveInterval < 0)
-                ? mLastGoodKeepAliveInterval
-                : mKeepAliveInterval;
-    }
-
-    private boolean isBehindNAT(String address) {
-        try {
-            byte[] d = InetAddress.getByName(address).getAddress();
-            if ((d[0] == 10) ||
-                    (((0x000000FF & ((int)d[0])) == 172) &&
-                    ((0x000000F0 & ((int)d[1])) == 16)) ||
-                    (((0x000000FF & ((int)d[0])) == 192) &&
-                    ((0x000000FF & ((int)d[1])) == 168))) {
-                return true;
-            }
-        } catch (UnknownHostException e) {
-            Log.e(TAG, "isBehindAT()" + address, e);
-        }
-        return false;
-    }
-
-    private class SipSessionGroupExt extends SipSessionAdapter {
-        private SipSessionGroup mSipGroup;
-        private PendingIntent mIncomingCallPendingIntent;
-        private boolean mOpenedToReceiveCalls;
-
-        private AutoRegistrationProcess mAutoRegistration =
-                new AutoRegistrationProcess();
-
-        public SipSessionGroupExt(SipProfile localProfile,
-                PendingIntent incomingCallPendingIntent,
-                ISipSessionListener listener) throws SipException {
-            mSipGroup = new SipSessionGroup(duplicate(localProfile),
-                    localProfile.getPassword(), mTimer, mMyWakeLock);
-            mIncomingCallPendingIntent = incomingCallPendingIntent;
-            mAutoRegistration.setListener(listener);
-        }
-
-        public SipProfile getLocalProfile() {
-            return mSipGroup.getLocalProfile();
-        }
-
-        public boolean containsSession(String callId) {
-            return mSipGroup.containsSession(callId);
-        }
-
-        public void onKeepAliveIntervalChanged() {
-            mAutoRegistration.onKeepAliveIntervalChanged();
-        }
-
-        // TODO: remove this method once SipWakeupTimer can better handle variety
-        // of timeout values
-        void setWakeupTimer(SipWakeupTimer timer) {
-            mSipGroup.setWakeupTimer(timer);
-        }
-
-        private SipProfile duplicate(SipProfile p) {
-            try {
-                return new SipProfile.Builder(p).setPassword("*").build();
-            } catch (Exception e) {
-                Log.wtf(TAG, "duplicate()", e);
-                throw new RuntimeException("duplicate profile", e);
-            }
-        }
-
-        public void setListener(ISipSessionListener listener) {
-            mAutoRegistration.setListener(listener);
-        }
-
-        public void setIncomingCallPendingIntent(PendingIntent pIntent) {
-            mIncomingCallPendingIntent = pIntent;
-        }
-
-        public void openToReceiveCalls() throws SipException {
-            mOpenedToReceiveCalls = true;
-            if (mNetworkType != -1) {
-                mSipGroup.openToReceiveCalls(this);
-                mAutoRegistration.start(mSipGroup);
-            }
-            if (DEBUG) Log.d(TAG, "  openToReceiveCalls: " + getUri() + ": "
-                    + mIncomingCallPendingIntent);
-        }
-
-        public void onConnectivityChanged(boolean connected)
-                throws SipException {
-            mSipGroup.onConnectivityChanged();
-            if (connected) {
-                mSipGroup.reset();
-                if (mOpenedToReceiveCalls) openToReceiveCalls();
-            } else {
-                // close mSipGroup but remember mOpenedToReceiveCalls
-                if (DEBUG) Log.d(TAG, "  close auto reg temporarily: "
-                        + getUri() + ": " + mIncomingCallPendingIntent);
-                mSipGroup.close();
-                mAutoRegistration.stop();
-            }
-        }
-
-        public void close() {
-            mOpenedToReceiveCalls = false;
-            mSipGroup.close();
-            mAutoRegistration.stop();
-            if (DEBUG) Log.d(TAG, "   close: " + getUri() + ": "
-                    + mIncomingCallPendingIntent);
-        }
-
-        public ISipSession createSession(ISipSessionListener listener) {
-            return mSipGroup.createSession(listener);
-        }
-
-        @Override
-        public void onRinging(ISipSession s, SipProfile caller,
-                String sessionDescription) {
-            if (DEBUG) Log.d(TAG, "<<<<< onRinging()");
-            SipSessionGroup.SipSessionImpl session =
-                    (SipSessionGroup.SipSessionImpl) s;
-            synchronized (SipService.this) {
-                try {
-                    if (!isRegistered() || callingSelf(this, session)) {
-                        session.endCall();
-                        return;
-                    }
-
-                    // send out incoming call broadcast
-                    addPendingSession(session);
-                    Intent intent = SipManager.createIncomingCallBroadcast(
-                            session.getCallId(), sessionDescription);
-                    if (DEBUG) Log.d(TAG, " ringing~~ " + getUri() + ": "
-                            + caller.getUri() + ": " + session.getCallId()
-                            + " " + mIncomingCallPendingIntent);
-                    mIncomingCallPendingIntent.send(mContext,
-                            SipManager.INCOMING_CALL_RESULT_CODE, intent);
-                } catch (PendingIntent.CanceledException e) {
-                    Log.w(TAG, "pendingIntent is canceled, drop incoming call");
-                    session.endCall();
-                }
-            }
-        }
-
-        @Override
-        public void onError(ISipSession session, int errorCode,
-                String message) {
-            if (DEBUG) Log.d(TAG, "sip session error: "
-                    + SipErrorCode.toString(errorCode) + ": " + message);
-        }
-
-        public boolean isOpenedToReceiveCalls() {
-            return mOpenedToReceiveCalls;
-        }
-
-        public boolean isRegistered() {
-            return mAutoRegistration.isRegistered();
-        }
-
-        private String getUri() {
-            return mSipGroup.getLocalProfileUri();
-        }
-    }
-
-    private class IntervalMeasurementProcess implements Runnable,
-            SipSessionGroup.KeepAliveProcessCallback {
-        private static final String TAG = "SipKeepAliveInterval";
-        private static final int MIN_INTERVAL = 5; // in seconds
-        private static final int PASS_THRESHOLD = 10;
-        private static final int MAX_RETRY_COUNT = 5;
-        private static final int NAT_MEASUREMENT_RETRY_INTERVAL = 120; // in seconds
-        private SipProfile mLocalProfile;
-        private SipSessionGroupExt mGroup;
-        private SipSessionGroup.SipSessionImpl mSession;
-        private int mMinInterval;
-        private int mMaxInterval;
-        private int mInterval;
-        private int mPassCount;
-
-        public IntervalMeasurementProcess(SipProfile localProfile,
-                int minInterval, int maxInterval) {
-            mMaxInterval = maxInterval;
-            mMinInterval = minInterval;
-            mLocalProfile = localProfile;
-        }
-
-        public void start() {
-            synchronized (SipService.this) {
-                if (mSession != null) {
-                    return;
-                }
-
-                mInterval = (mMaxInterval + mMinInterval) / 2;
-                mPassCount = 0;
-
-                // Don't start measurement if the interval is too small
-                if (mInterval < DEFAULT_KEEPALIVE_INTERVAL || checkTermination()) {
-                    Log.w(TAG, "measurement aborted; interval=[" +
-                            mMinInterval + "," + mMaxInterval + "]");
-                    return;
-                }
-
-                try {
-                    Log.d(TAG, "start measurement w interval=" + mInterval);
-
-                    mGroup = new SipSessionGroupExt(mLocalProfile, null, null);
-                    // TODO: remove this line once SipWakeupTimer can better handle
-                    // variety of timeout values
-                    mGroup.setWakeupTimer(new SipWakeupTimer(mContext, mExecutor));
-
-                    mSession = (SipSessionGroup.SipSessionImpl)
-                            mGroup.createSession(null);
-                    mSession.startKeepAliveProcess(mInterval, this);
-                } catch (Throwable t) {
-                    onError(SipErrorCode.CLIENT_ERROR, t.toString());
-                }
-            }
-        }
-
-        public void stop() {
-            synchronized (SipService.this) {
-                if (mSession != null) {
-                    mSession.stopKeepAliveProcess();
-                    mSession = null;
-                }
-                if (mGroup != null) {
-                    mGroup.close();
-                    mGroup = null;
-                }
-                mTimer.cancel(this);
-            }
-        }
-
-        private void restart() {
-            synchronized (SipService.this) {
-                // Return immediately if the measurement process is stopped
-                if (mSession == null) return;
-
-                Log.d(TAG, "restart measurement w interval=" + mInterval);
-                try {
-                    mSession.stopKeepAliveProcess();
-                    mPassCount = 0;
-                    mSession.startKeepAliveProcess(mInterval, this);
-                } catch (SipException e) {
-                    Log.e(TAG, "restart()", e);
-                }
-            }
-        }
-
-        private boolean checkTermination() {
-            return ((mMaxInterval - mMinInterval) < MIN_INTERVAL);
-        }
-
-        // SipSessionGroup.KeepAliveProcessCallback
-        @Override
-        public void onResponse(boolean portChanged) {
-            synchronized (SipService.this) {
-                if (!portChanged) {
-                    if (++mPassCount != PASS_THRESHOLD) return;
-                    // update the interval, since the current interval is good to
-                    // keep the port mapping.
-                    if (mKeepAliveInterval > 0) {
-                        mLastGoodKeepAliveInterval = mKeepAliveInterval;
-                    }
-                    mKeepAliveInterval = mMinInterval = mInterval;
-                    if (DEBUG) {
-                        Log.d(TAG, "measured good keepalive interval: "
-                                + mKeepAliveInterval);
-                    }
-                    onKeepAliveIntervalChanged();
-                } else {
-                    // Since the rport is changed, shorten the interval.
-                    mMaxInterval = mInterval;
-                }
-                if (checkTermination()) {
-                    // update mKeepAliveInterval and stop measurement.
-                    stop();
-                    // If all the measurements failed, we still set it to
-                    // mMinInterval; If mMinInterval still doesn't work, a new
-                    // measurement with min interval=DEFAULT_KEEPALIVE_INTERVAL
-                    // will be conducted.
-                    mKeepAliveInterval = mMinInterval;
-                    if (DEBUG) {
-                        Log.d(TAG, "measured keepalive interval: "
-                                + mKeepAliveInterval);
-                    }
-                } else {
-                    // calculate the new interval and continue.
-                    mInterval = (mMaxInterval + mMinInterval) / 2;
-                    if (DEBUG) {
-                        Log.d(TAG, "current interval: " + mKeepAliveInterval
-                                + ", test new interval: " + mInterval);
-                    }
-                    restart();
-                }
-            }
-        }
-
-        // SipSessionGroup.KeepAliveProcessCallback
-        @Override
-        public void onError(int errorCode, String description) {
-            Log.w(TAG, "interval measurement error: " + description);
-            restartLater();
-        }
-
-        // timeout handler
-        @Override
-        public void run() {
-            mTimer.cancel(this);
-            restart();
-        }
-
-        private void restartLater() {
-            synchronized (SipService.this) {
-                int interval = NAT_MEASUREMENT_RETRY_INTERVAL;
-                mTimer.cancel(this);
-                mTimer.set(interval * 1000, this);
-            }
-        }
-    }
-
-    private class AutoRegistrationProcess extends SipSessionAdapter
-            implements Runnable, SipSessionGroup.KeepAliveProcessCallback {
-        private static final int MIN_KEEPALIVE_SUCCESS_COUNT = 10;
-        private String TAG = "SipAutoReg";
-
-        private SipSessionGroup.SipSessionImpl mSession;
-        private SipSessionGroup.SipSessionImpl mKeepAliveSession;
-        private SipSessionListenerProxy mProxy = new SipSessionListenerProxy();
-        private int mBackoff = 1;
-        private boolean mRegistered;
-        private long mExpiryTime;
-        private int mErrorCode;
-        private String mErrorMessage;
-        private boolean mRunning = false;
-
-        private int mKeepAliveSuccessCount = 0;
-
-        private String getAction() {
-            return toString();
-        }
-
-        public void start(SipSessionGroup group) {
-            if (!mRunning) {
-                mRunning = true;
-                mBackoff = 1;
-                mSession = (SipSessionGroup.SipSessionImpl)
-                        group.createSession(this);
-                // return right away if no active network connection.
-                if (mSession == null) return;
-
-                // start unregistration to clear up old registration at server
-                // TODO: when rfc5626 is deployed, use reg-id and sip.instance
-                // in registration to avoid adding duplicate entries to server
-                mMyWakeLock.acquire(mSession);
-                mSession.unregister();
-                TAG = "SipAutoReg:" + mSession.getLocalProfile().getUriString();
-            }
-        }
-
-        private void startKeepAliveProcess(int interval) {
-            if (DEBUG) Log.d(TAG, "start keepalive w interval=" + interval);
-            if (mKeepAliveSession == null) {
-                mKeepAliveSession = mSession.duplicate();
-            } else {
-                mKeepAliveSession.stopKeepAliveProcess();
-            }
-            try {
-                mKeepAliveSession.startKeepAliveProcess(interval, this);
-            } catch (SipException e) {
-                Log.e(TAG, "failed to start keepalive w interval=" + interval,
-                        e);
-            }
-        }
-
-        private void stopKeepAliveProcess() {
-            if (mKeepAliveSession != null) {
-                mKeepAliveSession.stopKeepAliveProcess();
-                mKeepAliveSession = null;
-            }
-            mKeepAliveSuccessCount = 0;
-        }
-
-        // SipSessionGroup.KeepAliveProcessCallback
-        @Override
-        public void onResponse(boolean portChanged) {
-            synchronized (SipService.this) {
-                if (portChanged) {
-                    int interval = getKeepAliveInterval();
-                    if (mKeepAliveSuccessCount < MIN_KEEPALIVE_SUCCESS_COUNT) {
-                        Log.i(TAG, "keepalive doesn't work with interval "
-                                + interval + ", past success count="
-                                + mKeepAliveSuccessCount);
-                        if (interval > DEFAULT_KEEPALIVE_INTERVAL) {
-                            restartPortMappingLifetimeMeasurement(
-                                    mSession.getLocalProfile(), interval);
-                            mKeepAliveSuccessCount = 0;
-                        }
-                    } else {
-                        if (DEBUG) {
-                            Log.i(TAG, "keep keepalive going with interval "
-                                    + interval + ", past success count="
-                                    + mKeepAliveSuccessCount);
-                        }
-                        mKeepAliveSuccessCount /= 2;
-                    }
-                } else {
-                    // Start keep-alive interval measurement on the first
-                    // successfully kept-alive SipSessionGroup
-                    startPortMappingLifetimeMeasurement(
-                            mSession.getLocalProfile());
-                    mKeepAliveSuccessCount++;
-                }
-
-                if (!mRunning || !portChanged) return;
-
-                // The keep alive process is stopped when port is changed;
-                // Nullify the session so that the process can be restarted
-                // again when the re-registration is done
-                mKeepAliveSession = null;
-
-                // Acquire wake lock for the registration process. The
-                // lock will be released when registration is complete.
-                mMyWakeLock.acquire(mSession);
-                mSession.register(EXPIRY_TIME);
-            }
-        }
-
-        // SipSessionGroup.KeepAliveProcessCallback
-        @Override
-        public void onError(int errorCode, String description) {
-            if (DEBUG) {
-                Log.e(TAG, "keepalive error: " + description);
-            }
-            onResponse(true); // re-register immediately
-        }
-
-        public void stop() {
-            if (!mRunning) return;
-            mRunning = false;
-            mMyWakeLock.release(mSession);
-            if (mSession != null) {
-                mSession.setListener(null);
-                if (mNetworkType != -1 && mRegistered) mSession.unregister();
-            }
-
-            mTimer.cancel(this);
-            stopKeepAliveProcess();
-
-            mRegistered = false;
-            setListener(mProxy.getListener());
-        }
-
-        public void onKeepAliveIntervalChanged() {
-            if (mKeepAliveSession != null) {
-                int newInterval = getKeepAliveInterval();
-                if (DEBUG) {
-                    Log.v(TAG, "restart keepalive w interval=" + newInterval);
-                }
-                mKeepAliveSuccessCount = 0;
-                startKeepAliveProcess(newInterval);
-            }
-        }
-
-        public void setListener(ISipSessionListener listener) {
-            synchronized (SipService.this) {
-                mProxy.setListener(listener);
-
-                try {
-                    int state = (mSession == null)
-                            ? SipSession.State.READY_TO_CALL
-                            : mSession.getState();
-                    if ((state == SipSession.State.REGISTERING)
-                            || (state == SipSession.State.DEREGISTERING)) {
-                        mProxy.onRegistering(mSession);
-                    } else if (mRegistered) {
-                        int duration = (int)
-                                (mExpiryTime - SystemClock.elapsedRealtime());
-                        mProxy.onRegistrationDone(mSession, duration);
-                    } else if (mErrorCode != SipErrorCode.NO_ERROR) {
-                        if (mErrorCode == SipErrorCode.TIME_OUT) {
-                            mProxy.onRegistrationTimeout(mSession);
-                        } else {
-                            mProxy.onRegistrationFailed(mSession, mErrorCode,
-                                    mErrorMessage);
-                        }
-                    } else if (mNetworkType == -1) {
-                        mProxy.onRegistrationFailed(mSession,
-                                SipErrorCode.DATA_CONNECTION_LOST,
-                                "no data connection");
-                    } else if (!mRunning) {
-                        mProxy.onRegistrationFailed(mSession,
-                                SipErrorCode.CLIENT_ERROR,
-                                "registration not running");
-                    } else {
-                        mProxy.onRegistrationFailed(mSession,
-                                SipErrorCode.IN_PROGRESS,
-                                String.valueOf(state));
-                    }
-                } catch (Throwable t) {
-                    Log.w(TAG, "setListener(): " + t);
-                }
-            }
-        }
-
-        public boolean isRegistered() {
-            return mRegistered;
-        }
-
-        // timeout handler: re-register
-        @Override
-        public void run() {
-            synchronized (SipService.this) {
-                if (!mRunning) return;
-
-                mErrorCode = SipErrorCode.NO_ERROR;
-                mErrorMessage = null;
-                if (DEBUG) Log.d(TAG, "registering");
-                if (mNetworkType != -1) {
-                    mMyWakeLock.acquire(mSession);
-                    mSession.register(EXPIRY_TIME);
-                }
-            }
-        }
-
-        private void restart(int duration) {
-            Log.d(TAG, "Refresh registration " + duration + "s later.");
-            mTimer.cancel(this);
-            mTimer.set(duration * 1000, this);
-        }
-
-        private int backoffDuration() {
-            int duration = SHORT_EXPIRY_TIME * mBackoff;
-            if (duration > 3600) {
-                duration = 3600;
-            } else {
-                mBackoff *= 2;
-            }
-            return duration;
-        }
-
-        @Override
-        public void onRegistering(ISipSession session) {
-            if (DEBUG) Log.d(TAG, "onRegistering(): " + session);
-            synchronized (SipService.this) {
-                if (notCurrentSession(session)) return;
-
-                mRegistered = false;
-                mProxy.onRegistering(session);
-            }
-        }
-
-        private boolean notCurrentSession(ISipSession session) {
-            if (session != mSession) {
-                ((SipSessionGroup.SipSessionImpl) session).setListener(null);
-                mMyWakeLock.release(session);
-                return true;
-            }
-            return !mRunning;
-        }
-
-        @Override
-        public void onRegistrationDone(ISipSession session, int duration) {
-            if (DEBUG) Log.d(TAG, "onRegistrationDone(): " + session);
-            synchronized (SipService.this) {
-                if (notCurrentSession(session)) return;
-
-                mProxy.onRegistrationDone(session, duration);
-
-                if (duration > 0) {
-                    mExpiryTime = SystemClock.elapsedRealtime()
-                            + (duration * 1000);
-
-                    if (!mRegistered) {
-                        mRegistered = true;
-                        // allow some overlap to avoid call drop during renew
-                        duration -= MIN_EXPIRY_TIME;
-                        if (duration < MIN_EXPIRY_TIME) {
-                            duration = MIN_EXPIRY_TIME;
-                        }
-                        restart(duration);
-
-                        SipProfile localProfile = mSession.getLocalProfile();
-                        if ((mKeepAliveSession == null) && (isBehindNAT(mLocalIp)
-                                || localProfile.getSendKeepAlive())) {
-                            startKeepAliveProcess(getKeepAliveInterval());
-                        }
-                    }
-                    mMyWakeLock.release(session);
-                } else {
-                    mRegistered = false;
-                    mExpiryTime = -1L;
-                    if (DEBUG) Log.d(TAG, "Refresh registration immediately");
-                    run();
-                }
-            }
-        }
-
-        @Override
-        public void onRegistrationFailed(ISipSession session, int errorCode,
-                String message) {
-            if (DEBUG) Log.d(TAG, "onRegistrationFailed(): " + session + ": "
-                    + SipErrorCode.toString(errorCode) + ": " + message);
-            synchronized (SipService.this) {
-                if (notCurrentSession(session)) return;
-
-                switch (errorCode) {
-                    case SipErrorCode.INVALID_CREDENTIALS:
-                    case SipErrorCode.SERVER_UNREACHABLE:
-                        if (DEBUG) Log.d(TAG, "   pause auto-registration");
-                        stop();
-                        break;
-                    default:
-                        restartLater();
-                }
-
-                mErrorCode = errorCode;
-                mErrorMessage = message;
-                mProxy.onRegistrationFailed(session, errorCode, message);
-                mMyWakeLock.release(session);
-            }
-        }
-
-        @Override
-        public void onRegistrationTimeout(ISipSession session) {
-            if (DEBUG) Log.d(TAG, "onRegistrationTimeout(): " + session);
-            synchronized (SipService.this) {
-                if (notCurrentSession(session)) return;
-
-                mErrorCode = SipErrorCode.TIME_OUT;
-                mProxy.onRegistrationTimeout(session);
-                restartLater();
-                mMyWakeLock.release(session);
-            }
-        }
-
-        private void restartLater() {
-            mRegistered = false;
-            restart(backoffDuration());
-        }
-    }
-
-    private class ConnectivityReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            Bundle bundle = intent.getExtras();
-            if (bundle != null) {
-                final NetworkInfo info = (NetworkInfo)
-                        bundle.get(ConnectivityManager.EXTRA_NETWORK_INFO);
-
-                // Run the handler in MyExecutor to be protected by wake lock
-                mExecutor.execute(new Runnable() {
-                    public void run() {
-                        onConnectivityChanged(info);
-                    }
-                });
-            }
-        }
-    }
-
-    private void registerReceivers() {
-        mContext.registerReceiver(mConnectivityReceiver,
-                new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
-        if (DEBUG) Log.d(TAG, " +++ register receivers");
-    }
-
-    private void unregisterReceivers() {
-        mContext.unregisterReceiver(mConnectivityReceiver);
-        if (DEBUG) Log.d(TAG, " --- unregister receivers");
-
-        // Reset variables maintained by ConnectivityReceiver.
-        mWifiLock.release();
-        mNetworkType = -1;
-    }
-
-    private void updateWakeLocks() {
-        for (SipSessionGroupExt group : mSipGroups.values()) {
-            if (group.isOpenedToReceiveCalls()) {
-                // Also grab the WifiLock when we are disconnected, so the
-                // system will keep trying to reconnect. It will be released
-                // when the system eventually connects to something else.
-                if (mNetworkType == ConnectivityManager.TYPE_WIFI || mNetworkType == -1) {
-                    mWifiLock.acquire();
-                } else {
-                    mWifiLock.release();
-                }
-                return;
-            }
-        }
-        mWifiLock.release();
-        mMyWakeLock.reset(); // in case there's a leak
-    }
-
-    private synchronized void onConnectivityChanged(NetworkInfo info) {
-        // We only care about the default network, and getActiveNetworkInfo()
-        // is the only way to distinguish them. However, as broadcasts are
-        // delivered asynchronously, we might miss DISCONNECTED events from
-        // getActiveNetworkInfo(), which is critical to our SIP stack. To
-        // solve this, if it is a DISCONNECTED event to our current network,
-        // respect it. Otherwise get a new one from getActiveNetworkInfo().
-        if (info == null || info.isConnected() || info.getType() != mNetworkType) {
-            ConnectivityManager cm = (ConnectivityManager)
-                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-            info = cm.getActiveNetworkInfo();
-        }
-
-        // Some devices limit SIP on Wi-Fi. In this case, if we are not on
-        // Wi-Fi, treat it as a DISCONNECTED event.
-        int networkType = (info != null && info.isConnected()) ? info.getType() : -1;
-        if (mSipOnWifiOnly && networkType != ConnectivityManager.TYPE_WIFI) {
-            networkType = -1;
-        }
-
-        // Ignore the event if the current active network is not changed.
-        if (mNetworkType == networkType) {
-            return;
-        }
-        if (DEBUG) {
-            Log.d(TAG, "onConnectivityChanged(): " + mNetworkType +
-                    " -> " + networkType);
-        }
-
-        try {
-            if (mNetworkType != -1) {
-                mLocalIp = null;
-                stopPortMappingMeasurement();
-                for (SipSessionGroupExt group : mSipGroups.values()) {
-                    group.onConnectivityChanged(false);
-                }
-            }
-            mNetworkType = networkType;
-
-            if (mNetworkType != -1) {
-                mLocalIp = determineLocalIp();
-                mKeepAliveInterval = -1;
-                mLastGoodKeepAliveInterval = DEFAULT_KEEPALIVE_INTERVAL;
-                for (SipSessionGroupExt group : mSipGroups.values()) {
-                    group.onConnectivityChanged(true);
-                }
-            }
-            updateWakeLocks();
-        } catch (SipException e) {
-            Log.e(TAG, "onConnectivityChanged()", e);
-        }
-    }
-
-    private static Looper createLooper() {
-        HandlerThread thread = new HandlerThread("SipService.Executor");
-        thread.start();
-        return thread.getLooper();
-    }
-
-    // Executes immediate tasks in a single thread.
-    // Hold/release wake lock for running tasks
-    private class MyExecutor extends Handler implements Executor {
-        MyExecutor() {
-            super(createLooper());
-        }
-
-        @Override
-        public void execute(Runnable task) {
-            mMyWakeLock.acquire(task);
-            Message.obtain(this, 0/* don't care */, task).sendToTarget();
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.obj instanceof Runnable) {
-                executeInternal((Runnable) msg.obj);
-            } else {
-                Log.w(TAG, "can't handle msg: " + msg);
-            }
-        }
-
-        private void executeInternal(Runnable task) {
-            try {
-                task.run();
-            } catch (Throwable t) {
-                Log.e(TAG, "run task: " + task, t);
-            } finally {
-                mMyWakeLock.release(task);
-            }
-        }
-    }
-}
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
deleted file mode 100644
index 6acd456..0000000
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ /dev/null
@@ -1,1835 +0,0 @@
-/*
- * Copyright (C) 2010 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.server.sip;
-
-import gov.nist.javax.sip.clientauthutils.AccountManager;
-import gov.nist.javax.sip.clientauthutils.UserCredentials;
-import gov.nist.javax.sip.header.ProxyAuthenticate;
-import gov.nist.javax.sip.header.ReferTo;
-import gov.nist.javax.sip.header.SIPHeaderNames;
-import gov.nist.javax.sip.header.StatusLine;
-import gov.nist.javax.sip.header.WWWAuthenticate;
-import gov.nist.javax.sip.header.extensions.ReferredByHeader;
-import gov.nist.javax.sip.header.extensions.ReplacesHeader;
-import gov.nist.javax.sip.message.SIPMessage;
-import gov.nist.javax.sip.message.SIPResponse;
-
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipErrorCode;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSession;
-import android.net.sip.SipSessionAdapter;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.text.ParseException;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.sip.ClientTransaction;
-import javax.sip.Dialog;
-import javax.sip.DialogTerminatedEvent;
-import javax.sip.IOExceptionEvent;
-import javax.sip.ListeningPoint;
-import javax.sip.ObjectInUseException;
-import javax.sip.RequestEvent;
-import javax.sip.ResponseEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipException;
-import javax.sip.SipFactory;
-import javax.sip.SipListener;
-import javax.sip.SipProvider;
-import javax.sip.SipStack;
-import javax.sip.TimeoutEvent;
-import javax.sip.Transaction;
-import javax.sip.TransactionState;
-import javax.sip.TransactionTerminatedEvent;
-import javax.sip.TransactionUnavailableException;
-import javax.sip.address.Address;
-import javax.sip.address.SipURI;
-import javax.sip.header.CSeqHeader;
-import javax.sip.header.ContactHeader;
-import javax.sip.header.ExpiresHeader;
-import javax.sip.header.FromHeader;
-import javax.sip.header.HeaderAddress;
-import javax.sip.header.MinExpiresHeader;
-import javax.sip.header.ReferToHeader;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.Message;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-
-/**
- * Manages {@link ISipSession}'s for a SIP account.
- */
-class SipSessionGroup implements SipListener {
-    private static final String TAG = "SipSession";
-    private static final boolean DEBUG = false;
-    private static final boolean DEBUG_PING = false;
-    private static final String ANONYMOUS = "anonymous";
-    // Limit the size of thread pool to 1 for the order issue when the phone is
-    // waken up from sleep and there are many packets to be processed in the SIP
-    // stack. Note: The default thread pool size in NIST SIP stack is -1 which is
-    // unlimited.
-    private static final String THREAD_POOL_SIZE = "1";
-    private static final int EXPIRY_TIME = 3600; // in seconds
-    private static final int CANCEL_CALL_TIMER = 3; // in seconds
-    private static final int END_CALL_TIMER = 3; // in seconds
-    private static final int KEEPALIVE_TIMEOUT = 5; // in seconds
-    private static final int INCALL_KEEPALIVE_INTERVAL = 10; // in seconds
-    private static final long WAKE_LOCK_HOLDING_TIME = 500; // in milliseconds
-
-    private static final EventObject DEREGISTER = new EventObject("Deregister");
-    private static final EventObject END_CALL = new EventObject("End call");
-    private static final EventObject HOLD_CALL = new EventObject("Hold call");
-    private static final EventObject CONTINUE_CALL
-            = new EventObject("Continue call");
-
-    private final SipProfile mLocalProfile;
-    private final String mPassword;
-
-    private SipStack mSipStack;
-    private SipHelper mSipHelper;
-
-    // session that processes INVITE requests
-    private SipSessionImpl mCallReceiverSession;
-    private String mLocalIp;
-
-    private SipWakeupTimer mWakeupTimer;
-    private SipWakeLock mWakeLock;
-
-    // call-id-to-SipSession map
-    private Map<String, SipSessionImpl> mSessionMap =
-            new HashMap<String, SipSessionImpl>();
-
-    // external address observed from any response
-    private String mExternalIp;
-    private int mExternalPort;
-
-    /**
-     * @param profile the local profile with password crossed out
-     * @param password the password of the profile
-     * @throws IOException if cannot assign requested address
-     */
-    public SipSessionGroup(SipProfile profile, String password,
-            SipWakeupTimer timer, SipWakeLock wakeLock) throws SipException {
-        mLocalProfile = profile;
-        mPassword = password;
-        mWakeupTimer = timer;
-        mWakeLock = wakeLock;
-        reset();
-    }
-
-    // TODO: remove this method once SipWakeupTimer can better handle variety
-    // of timeout values
-    void setWakeupTimer(SipWakeupTimer timer) {
-        mWakeupTimer = timer;
-    }
-
-    synchronized void reset() throws SipException {
-        Properties properties = new Properties();
-
-        String protocol = mLocalProfile.getProtocol();
-        int port = mLocalProfile.getPort();
-        String server = mLocalProfile.getProxyAddress();
-
-        if (!TextUtils.isEmpty(server)) {
-            properties.setProperty("javax.sip.OUTBOUND_PROXY",
-                    server + ':' + port + '/' + protocol);
-        } else {
-            server = mLocalProfile.getSipDomain();
-        }
-        if (server.startsWith("[") && server.endsWith("]")) {
-            server = server.substring(1, server.length() - 1);
-        }
-
-        String local = null;
-        try {
-            for (InetAddress remote : InetAddress.getAllByName(server)) {
-                DatagramSocket socket = new DatagramSocket();
-                socket.connect(remote, port);
-                if (socket.isConnected()) {
-                    local = socket.getLocalAddress().getHostAddress();
-                    port = socket.getLocalPort();
-                    socket.close();
-                    break;
-                }
-                socket.close();
-            }
-        } catch (Exception e) {
-            // ignore.
-        }
-        if (local == null) {
-            // We are unable to reach the server. Just bail out.
-            return;
-        }
-
-        close();
-        mLocalIp = local;
-
-        properties.setProperty("javax.sip.STACK_NAME", getStackName());
-        properties.setProperty(
-                "gov.nist.javax.sip.THREAD_POOL_SIZE", THREAD_POOL_SIZE);
-        mSipStack = SipFactory.getInstance().createSipStack(properties);
-        try {
-            SipProvider provider = mSipStack.createSipProvider(
-                    mSipStack.createListeningPoint(local, port, protocol));
-            provider.addSipListener(this);
-            mSipHelper = new SipHelper(mSipStack, provider);
-        } catch (SipException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new SipException("failed to initialize SIP stack", e);
-        }
-
-        Log.d(TAG, " start stack for " + mLocalProfile.getUriString());
-        mSipStack.start();
-    }
-
-    synchronized void onConnectivityChanged() {
-        SipSessionImpl[] ss = mSessionMap.values().toArray(
-                    new SipSessionImpl[mSessionMap.size()]);
-        // Iterate on the copied array instead of directly on mSessionMap to
-        // avoid ConcurrentModificationException being thrown when
-        // SipSessionImpl removes itself from mSessionMap in onError() in the
-        // following loop.
-        for (SipSessionImpl s : ss) {
-            s.onError(SipErrorCode.DATA_CONNECTION_LOST,
-                    "data connection lost");
-        }
-    }
-
-    synchronized void resetExternalAddress() {
-        if (DEBUG) {
-            Log.d(TAG, " reset external addr on " + mSipStack);
-        }
-        mExternalIp = null;
-        mExternalPort = 0;
-    }
-
-    public SipProfile getLocalProfile() {
-        return mLocalProfile;
-    }
-
-    public String getLocalProfileUri() {
-        return mLocalProfile.getUriString();
-    }
-
-    private String getStackName() {
-        return "stack" + System.currentTimeMillis();
-    }
-
-    public synchronized void close() {
-        Log.d(TAG, " close stack for " + mLocalProfile.getUriString());
-        onConnectivityChanged();
-        mSessionMap.clear();
-        closeToNotReceiveCalls();
-        if (mSipStack != null) {
-            mSipStack.stop();
-            mSipStack = null;
-            mSipHelper = null;
-        }
-        resetExternalAddress();
-    }
-
-    public synchronized boolean isClosed() {
-        return (mSipStack == null);
-    }
-
-    // For internal use, require listener not to block in callbacks.
-    public synchronized void openToReceiveCalls(ISipSessionListener listener) {
-        if (mCallReceiverSession == null) {
-            mCallReceiverSession = new SipSessionCallReceiverImpl(listener);
-        } else {
-            mCallReceiverSession.setListener(listener);
-        }
-    }
-
-    public synchronized void closeToNotReceiveCalls() {
-        mCallReceiverSession = null;
-    }
-
-    public ISipSession createSession(ISipSessionListener listener) {
-        return (isClosed() ? null : new SipSessionImpl(listener));
-    }
-
-    synchronized boolean containsSession(String callId) {
-        return mSessionMap.containsKey(callId);
-    }
-
-    private synchronized SipSessionImpl getSipSession(EventObject event) {
-        String key = SipHelper.getCallId(event);
-        SipSessionImpl session = mSessionMap.get(key);
-        if ((session != null) && isLoggable(session)) {
-            Log.d(TAG, "session key from event: " + key);
-            Log.d(TAG, "active sessions:");
-            for (String k : mSessionMap.keySet()) {
-                Log.d(TAG, " ..." + k + ": " + mSessionMap.get(k));
-            }
-        }
-        return ((session != null) ? session : mCallReceiverSession);
-    }
-
-    private synchronized void addSipSession(SipSessionImpl newSession) {
-        removeSipSession(newSession);
-        String key = newSession.getCallId();
-        mSessionMap.put(key, newSession);
-        if (isLoggable(newSession)) {
-            Log.d(TAG, "+++  add a session with key:  '" + key + "'");
-            for (String k : mSessionMap.keySet()) {
-                Log.d(TAG, "  " + k + ": " + mSessionMap.get(k));
-            }
-        }
-    }
-
-    private synchronized void removeSipSession(SipSessionImpl session) {
-        if (session == mCallReceiverSession) return;
-        String key = session.getCallId();
-        SipSessionImpl s = mSessionMap.remove(key);
-        // sanity check
-        if ((s != null) && (s != session)) {
-            Log.w(TAG, "session " + session + " is not associated with key '"
-                    + key + "'");
-            mSessionMap.put(key, s);
-            for (Map.Entry<String, SipSessionImpl> entry
-                    : mSessionMap.entrySet()) {
-                if (entry.getValue() == s) {
-                    key = entry.getKey();
-                    mSessionMap.remove(key);
-                }
-            }
-        }
-
-        if ((s != null) && isLoggable(s)) {
-            Log.d(TAG, "remove session " + session + " @key '" + key + "'");
-            for (String k : mSessionMap.keySet()) {
-                Log.d(TAG, "  " + k + ": " + mSessionMap.get(k));
-            }
-        }
-    }
-
-    public void processRequest(final RequestEvent event) {
-        if (isRequestEvent(Request.INVITE, event)) {
-            if (DEBUG) Log.d(TAG, "<<<<< got INVITE, thread:"
-                    + Thread.currentThread());
-            // Acquire a wake lock and keep it for WAKE_LOCK_HOLDING_TIME;
-            // should be large enough to bring up the app.
-            mWakeLock.acquire(WAKE_LOCK_HOLDING_TIME);
-        }
-        process(event);
-    }
-
-    public void processResponse(ResponseEvent event) {
-        process(event);
-    }
-
-    public void processIOException(IOExceptionEvent event) {
-        process(event);
-    }
-
-    public void processTimeout(TimeoutEvent event) {
-        process(event);
-    }
-
-    public void processTransactionTerminated(TransactionTerminatedEvent event) {
-        process(event);
-    }
-
-    public void processDialogTerminated(DialogTerminatedEvent event) {
-        process(event);
-    }
-
-    private synchronized void process(EventObject event) {
-        SipSessionImpl session = getSipSession(event);
-        try {
-            boolean isLoggable = isLoggable(session, event);
-            boolean processed = (session != null) && session.process(event);
-            if (isLoggable && processed) {
-                Log.d(TAG, "new state after: "
-                        + SipSession.State.toString(session.mState));
-            }
-        } catch (Throwable e) {
-            Log.w(TAG, "event process error: " + event, getRootCause(e));
-            session.onError(e);
-        }
-    }
-
-    private String extractContent(Message message) {
-        // Currently we do not support secure MIME bodies.
-        byte[] bytes = message.getRawContent();
-        if (bytes != null) {
-            try {
-                if (message instanceof SIPMessage) {
-                    return ((SIPMessage) message).getMessageContent();
-                } else {
-                    return new String(bytes, "UTF-8");
-                }
-            } catch (UnsupportedEncodingException e) {
-            }
-        }
-        return null;
-    }
-
-    private void extractExternalAddress(ResponseEvent evt) {
-        Response response = evt.getResponse();
-        ViaHeader viaHeader = (ViaHeader)(response.getHeader(
-                SIPHeaderNames.VIA));
-        if (viaHeader == null) return;
-        int rport = viaHeader.getRPort();
-        String externalIp = viaHeader.getReceived();
-        if ((rport > 0) && (externalIp != null)) {
-            mExternalIp = externalIp;
-            mExternalPort = rport;
-            if (DEBUG) {
-                Log.d(TAG, " got external addr " + externalIp + ":" + rport
-                        + " on " + mSipStack);
-            }
-        }
-    }
-
-    private Throwable getRootCause(Throwable exception) {
-        Throwable cause = exception.getCause();
-        while (cause != null) {
-            exception = cause;
-            cause = exception.getCause();
-        }
-        return exception;
-    }
-
-    private SipSessionImpl createNewSession(RequestEvent event,
-            ISipSessionListener listener, ServerTransaction transaction,
-            int newState) throws SipException {
-        SipSessionImpl newSession = new SipSessionImpl(listener);
-        newSession.mServerTransaction = transaction;
-        newSession.mState = newState;
-        newSession.mDialog = newSession.mServerTransaction.getDialog();
-        newSession.mInviteReceived = event;
-        newSession.mPeerProfile = createPeerProfile((HeaderAddress)
-                event.getRequest().getHeader(FromHeader.NAME));
-        newSession.mPeerSessionDescription =
-                extractContent(event.getRequest());
-        return newSession;
-    }
-
-    private class SipSessionCallReceiverImpl extends SipSessionImpl {
-        public SipSessionCallReceiverImpl(ISipSessionListener listener) {
-            super(listener);
-        }
-
-        private int processInviteWithReplaces(RequestEvent event,
-                ReplacesHeader replaces) {
-            String callId = replaces.getCallId();
-            SipSessionImpl session = mSessionMap.get(callId);
-            if (session == null) {
-                return Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST;
-            }
-
-            Dialog dialog = session.mDialog;
-            if (dialog == null) return Response.DECLINE;
-
-            if (!dialog.getLocalTag().equals(replaces.getToTag()) ||
-                    !dialog.getRemoteTag().equals(replaces.getFromTag())) {
-                // No match is found, returns 481.
-                return Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST;
-            }
-
-            ReferredByHeader referredBy = (ReferredByHeader) event.getRequest()
-                    .getHeader(ReferredByHeader.NAME);
-            if ((referredBy == null) ||
-                    !dialog.getRemoteParty().equals(referredBy.getAddress())) {
-                return Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST;
-            }
-            return Response.OK;
-        }
-
-        private void processNewInviteRequest(RequestEvent event)
-                throws SipException {
-            ReplacesHeader replaces = (ReplacesHeader) event.getRequest()
-                    .getHeader(ReplacesHeader.NAME);
-            SipSessionImpl newSession = null;
-            if (replaces != null) {
-                int response = processInviteWithReplaces(event, replaces);
-                if (DEBUG) {
-                    Log.v(TAG, "ReplacesHeader: " + replaces
-                            + " response=" + response);
-                }
-                if (response == Response.OK) {
-                    SipSessionImpl replacedSession =
-                            mSessionMap.get(replaces.getCallId());
-                    // got INVITE w/ replaces request.
-                    newSession = createNewSession(event,
-                            replacedSession.mProxy.getListener(),
-                            mSipHelper.getServerTransaction(event),
-                            SipSession.State.INCOMING_CALL);
-                    newSession.mProxy.onCallTransferring(newSession,
-                            newSession.mPeerSessionDescription);
-                } else {
-                    mSipHelper.sendResponse(event, response);
-                }
-            } else {
-                // New Incoming call.
-                newSession = createNewSession(event, mProxy,
-                        mSipHelper.sendRinging(event, generateTag()),
-                        SipSession.State.INCOMING_CALL);
-                mProxy.onRinging(newSession, newSession.mPeerProfile,
-                        newSession.mPeerSessionDescription);
-            }
-            if (newSession != null) addSipSession(newSession);
-        }
-
-        public boolean process(EventObject evt) throws SipException {
-            if (isLoggable(this, evt)) Log.d(TAG, " ~~~~~   " + this + ": "
-                    + SipSession.State.toString(mState) + ": processing "
-                    + log(evt));
-            if (isRequestEvent(Request.INVITE, evt)) {
-                processNewInviteRequest((RequestEvent) evt);
-                return true;
-            } else if (isRequestEvent(Request.OPTIONS, evt)) {
-                mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
-                return true;
-            } else {
-                return false;
-            }
-        }
-    }
-
-    static interface KeepAliveProcessCallback {
-        /** Invoked when the response of keeping alive comes back. */
-        void onResponse(boolean portChanged);
-        void onError(int errorCode, String description);
-    }
-
-    class SipSessionImpl extends ISipSession.Stub {
-        SipProfile mPeerProfile;
-        SipSessionListenerProxy mProxy = new SipSessionListenerProxy();
-        int mState = SipSession.State.READY_TO_CALL;
-        RequestEvent mInviteReceived;
-        Dialog mDialog;
-        ServerTransaction mServerTransaction;
-        ClientTransaction mClientTransaction;
-        String mPeerSessionDescription;
-        boolean mInCall;
-        SessionTimer mSessionTimer;
-        int mAuthenticationRetryCount;
-
-        private KeepAliveProcess mKeepAliveProcess;
-
-        private SipSessionImpl mKeepAliveSession;
-
-        // the following three members are used for handling refer request.
-        SipSessionImpl mReferSession;
-        ReferredByHeader mReferredBy;
-        String mReplaces;
-
-        // lightweight timer
-        class SessionTimer {
-            private boolean mRunning = true;
-
-            void start(final int timeout) {
-                new Thread(new Runnable() {
-                    public void run() {
-                        sleep(timeout);
-                        if (mRunning) timeout();
-                    }
-                }, "SipSessionTimerThread").start();
-            }
-
-            synchronized void cancel() {
-                mRunning = false;
-                this.notify();
-            }
-
-            private void timeout() {
-                synchronized (SipSessionGroup.this) {
-                    onError(SipErrorCode.TIME_OUT, "Session timed out!");
-                }
-            }
-
-            private synchronized void sleep(int timeout) {
-                try {
-                    this.wait(timeout * 1000);
-                } catch (InterruptedException e) {
-                    Log.e(TAG, "session timer interrupted!");
-                }
-            }
-        }
-
-        public SipSessionImpl(ISipSessionListener listener) {
-            setListener(listener);
-        }
-
-        SipSessionImpl duplicate() {
-            return new SipSessionImpl(mProxy.getListener());
-        }
-
-        private void reset() {
-            mInCall = false;
-            removeSipSession(this);
-            mPeerProfile = null;
-            mState = SipSession.State.READY_TO_CALL;
-            mInviteReceived = null;
-            mPeerSessionDescription = null;
-            mAuthenticationRetryCount = 0;
-            mReferSession = null;
-            mReferredBy = null;
-            mReplaces = null;
-
-            if (mDialog != null) mDialog.delete();
-            mDialog = null;
-
-            try {
-                if (mServerTransaction != null) mServerTransaction.terminate();
-            } catch (ObjectInUseException e) {
-                // ignored
-            }
-            mServerTransaction = null;
-
-            try {
-                if (mClientTransaction != null) mClientTransaction.terminate();
-            } catch (ObjectInUseException e) {
-                // ignored
-            }
-            mClientTransaction = null;
-
-            cancelSessionTimer();
-
-            if (mKeepAliveSession != null) {
-                mKeepAliveSession.stopKeepAliveProcess();
-                mKeepAliveSession = null;
-            }
-        }
-
-        public boolean isInCall() {
-            return mInCall;
-        }
-
-        public String getLocalIp() {
-            return mLocalIp;
-        }
-
-        public SipProfile getLocalProfile() {
-            return mLocalProfile;
-        }
-
-        public SipProfile getPeerProfile() {
-            return mPeerProfile;
-        }
-
-        public String getCallId() {
-            return SipHelper.getCallId(getTransaction());
-        }
-
-        private Transaction getTransaction() {
-            if (mClientTransaction != null) return mClientTransaction;
-            if (mServerTransaction != null) return mServerTransaction;
-            return null;
-        }
-
-        public int getState() {
-            return mState;
-        }
-
-        public void setListener(ISipSessionListener listener) {
-            mProxy.setListener((listener instanceof SipSessionListenerProxy)
-                    ? ((SipSessionListenerProxy) listener).getListener()
-                    : listener);
-        }
-
-        // process the command in a new thread
-        private void doCommandAsync(final EventObject command) {
-            new Thread(new Runnable() {
-                    public void run() {
-                        try {
-                            processCommand(command);
-                        } catch (Throwable e) {
-                            Log.w(TAG, "command error: " + command + ": "
-                                    + mLocalProfile.getUriString(),
-                                    getRootCause(e));
-                            onError(e);
-                        }
-                    }
-            }, "SipSessionAsyncCmdThread").start();
-        }
-
-        public void makeCall(SipProfile peerProfile, String sessionDescription,
-                int timeout) {
-            doCommandAsync(new MakeCallCommand(peerProfile, sessionDescription,
-                    timeout));
-        }
-
-        public void answerCall(String sessionDescription, int timeout) {
-            synchronized (SipSessionGroup.this) {
-                if (mPeerProfile == null) return;
-                doCommandAsync(new MakeCallCommand(mPeerProfile,
-                        sessionDescription, timeout));
-            }
-        }
-
-        public void endCall() {
-            doCommandAsync(END_CALL);
-        }
-
-        public void changeCall(String sessionDescription, int timeout) {
-            synchronized (SipSessionGroup.this) {
-                if (mPeerProfile == null) return;
-                doCommandAsync(new MakeCallCommand(mPeerProfile,
-                        sessionDescription, timeout));
-            }
-        }
-
-        public void register(int duration) {
-            doCommandAsync(new RegisterCommand(duration));
-        }
-
-        public void unregister() {
-            doCommandAsync(DEREGISTER);
-        }
-
-        private void processCommand(EventObject command) throws SipException {
-            if (isLoggable(command)) Log.d(TAG, "process cmd: " + command);
-            if (!process(command)) {
-                onError(SipErrorCode.IN_PROGRESS,
-                        "cannot initiate a new transaction to execute: "
-                        + command);
-            }
-        }
-
-        protected String generateTag() {
-            // 32-bit randomness
-            return String.valueOf((long) (Math.random() * 0x100000000L));
-        }
-
-        public String toString() {
-            try {
-                String s = super.toString();
-                return s.substring(s.indexOf("@")) + ":"
-                        + SipSession.State.toString(mState);
-            } catch (Throwable e) {
-                return super.toString();
-            }
-        }
-
-        public boolean process(EventObject evt) throws SipException {
-            if (isLoggable(this, evt)) Log.d(TAG, " ~~~~~   " + this + ": "
-                    + SipSession.State.toString(mState) + ": processing "
-                    + log(evt));
-            synchronized (SipSessionGroup.this) {
-                if (isClosed()) return false;
-
-                if (mKeepAliveProcess != null) {
-                    // event consumed by keepalive process
-                    if (mKeepAliveProcess.process(evt)) return true;
-                }
-
-                Dialog dialog = null;
-                if (evt instanceof RequestEvent) {
-                    dialog = ((RequestEvent) evt).getDialog();
-                } else if (evt instanceof ResponseEvent) {
-                    dialog = ((ResponseEvent) evt).getDialog();
-                    extractExternalAddress((ResponseEvent) evt);
-                }
-                if (dialog != null) mDialog = dialog;
-
-                boolean processed;
-
-                switch (mState) {
-                case SipSession.State.REGISTERING:
-                case SipSession.State.DEREGISTERING:
-                    processed = registeringToReady(evt);
-                    break;
-                case SipSession.State.READY_TO_CALL:
-                    processed = readyForCall(evt);
-                    break;
-                case SipSession.State.INCOMING_CALL:
-                    processed = incomingCall(evt);
-                    break;
-                case SipSession.State.INCOMING_CALL_ANSWERING:
-                    processed = incomingCallToInCall(evt);
-                    break;
-                case SipSession.State.OUTGOING_CALL:
-                case SipSession.State.OUTGOING_CALL_RING_BACK:
-                    processed = outgoingCall(evt);
-                    break;
-                case SipSession.State.OUTGOING_CALL_CANCELING:
-                    processed = outgoingCallToReady(evt);
-                    break;
-                case SipSession.State.IN_CALL:
-                    processed = inCall(evt);
-                    break;
-                case SipSession.State.ENDING_CALL:
-                    processed = endingCall(evt);
-                    break;
-                default:
-                    processed = false;
-                }
-                return (processed || processExceptions(evt));
-            }
-        }
-
-        private boolean processExceptions(EventObject evt) throws SipException {
-            if (isRequestEvent(Request.BYE, evt)) {
-                // terminate the call whenever a BYE is received
-                mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
-                endCallNormally();
-                return true;
-            } else if (isRequestEvent(Request.CANCEL, evt)) {
-                mSipHelper.sendResponse((RequestEvent) evt,
-                        Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST);
-                return true;
-            } else if (evt instanceof TransactionTerminatedEvent) {
-                if (isCurrentTransaction((TransactionTerminatedEvent) evt)) {
-                    if (evt instanceof TimeoutEvent) {
-                        processTimeout((TimeoutEvent) evt);
-                    } else {
-                        processTransactionTerminated(
-                                (TransactionTerminatedEvent) evt);
-                    }
-                    return true;
-                }
-            } else if (isRequestEvent(Request.OPTIONS, evt)) {
-                mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
-                return true;
-            } else if (evt instanceof DialogTerminatedEvent) {
-                processDialogTerminated((DialogTerminatedEvent) evt);
-                return true;
-            }
-            return false;
-        }
-
-        private void processDialogTerminated(DialogTerminatedEvent event) {
-            if (mDialog == event.getDialog()) {
-                onError(new SipException("dialog terminated"));
-            } else {
-                Log.d(TAG, "not the current dialog; current=" + mDialog
-                        + ", terminated=" + event.getDialog());
-            }
-        }
-
-        private boolean isCurrentTransaction(TransactionTerminatedEvent event) {
-            Transaction current = event.isServerTransaction()
-                    ? mServerTransaction
-                    : mClientTransaction;
-            Transaction target = event.isServerTransaction()
-                    ? event.getServerTransaction()
-                    : event.getClientTransaction();
-
-            if ((current != target) && (mState != SipSession.State.PINGING)) {
-                Log.d(TAG, "not the current transaction; current="
-                        + toString(current) + ", target=" + toString(target));
-                return false;
-            } else if (current != null) {
-                Log.d(TAG, "transaction terminated: " + toString(current));
-                return true;
-            } else {
-                // no transaction; shouldn't be here; ignored
-                return true;
-            }
-        }
-
-        private String toString(Transaction transaction) {
-            if (transaction == null) return "null";
-            Request request = transaction.getRequest();
-            Dialog dialog = transaction.getDialog();
-            CSeqHeader cseq = (CSeqHeader) request.getHeader(CSeqHeader.NAME);
-            return String.format("req=%s,%s,s=%s,ds=%s,", request.getMethod(),
-                    cseq.getSeqNumber(), transaction.getState(),
-                    ((dialog == null) ? "-" : dialog.getState()));
-        }
-
-        private void processTransactionTerminated(
-                TransactionTerminatedEvent event) {
-            switch (mState) {
-                case SipSession.State.IN_CALL:
-                case SipSession.State.READY_TO_CALL:
-                    Log.d(TAG, "Transaction terminated; do nothing");
-                    break;
-                default:
-                    Log.d(TAG, "Transaction terminated early: " + this);
-                    onError(SipErrorCode.TRANSACTION_TERMINTED,
-                            "transaction terminated");
-            }
-        }
-
-        private void processTimeout(TimeoutEvent event) {
-            Log.d(TAG, "processing Timeout...");
-            switch (mState) {
-                case SipSession.State.REGISTERING:
-                case SipSession.State.DEREGISTERING:
-                    reset();
-                    mProxy.onRegistrationTimeout(this);
-                    break;
-                case SipSession.State.INCOMING_CALL:
-                case SipSession.State.INCOMING_CALL_ANSWERING:
-                case SipSession.State.OUTGOING_CALL:
-                case SipSession.State.OUTGOING_CALL_CANCELING:
-                    onError(SipErrorCode.TIME_OUT, event.toString());
-                    break;
-
-                default:
-                    Log.d(TAG, "   do nothing");
-                    break;
-            }
-        }
-
-        private int getExpiryTime(Response response) {
-            int time = -1;
-            ContactHeader contact = (ContactHeader) response.getHeader(ContactHeader.NAME);
-            if (contact != null) {
-                time = contact.getExpires();
-            }
-            ExpiresHeader expires = (ExpiresHeader) response.getHeader(ExpiresHeader.NAME);
-            if (expires != null && (time < 0 || time > expires.getExpires())) {
-                time = expires.getExpires();
-            }
-            if (time <= 0) {
-                time = EXPIRY_TIME;
-            }
-            expires = (ExpiresHeader) response.getHeader(MinExpiresHeader.NAME);
-            if (expires != null && time < expires.getExpires()) {
-                time = expires.getExpires();
-            }
-            if (DEBUG) {
-                Log.v(TAG, "Expiry time = " + time);
-            }
-            return time;
-        }
-
-        private boolean registeringToReady(EventObject evt)
-                throws SipException {
-            if (expectResponse(Request.REGISTER, evt)) {
-                ResponseEvent event = (ResponseEvent) evt;
-                Response response = event.getResponse();
-
-                int statusCode = response.getStatusCode();
-                switch (statusCode) {
-                case Response.OK:
-                    int state = mState;
-                    onRegistrationDone((state == SipSession.State.REGISTERING)
-                            ? getExpiryTime(((ResponseEvent) evt).getResponse())
-                            : -1);
-                    return true;
-                case Response.UNAUTHORIZED:
-                case Response.PROXY_AUTHENTICATION_REQUIRED:
-                    handleAuthentication(event);
-                    return true;
-                default:
-                    if (statusCode >= 500) {
-                        onRegistrationFailed(response);
-                        return true;
-                    }
-                }
-            }
-            return false;
-        }
-
-        private boolean handleAuthentication(ResponseEvent event)
-                throws SipException {
-            Response response = event.getResponse();
-            String nonce = getNonceFromResponse(response);
-            if (nonce == null) {
-                onError(SipErrorCode.SERVER_ERROR,
-                        "server does not provide challenge");
-                return false;
-            } else if (mAuthenticationRetryCount < 2) {
-                mClientTransaction = mSipHelper.handleChallenge(
-                        event, getAccountManager());
-                mDialog = mClientTransaction.getDialog();
-                mAuthenticationRetryCount++;
-                if (isLoggable(this, event)) {
-                    Log.d(TAG, "   authentication retry count="
-                            + mAuthenticationRetryCount);
-                }
-                return true;
-            } else {
-                if (crossDomainAuthenticationRequired(response)) {
-                    onError(SipErrorCode.CROSS_DOMAIN_AUTHENTICATION,
-                            getRealmFromResponse(response));
-                } else {
-                    onError(SipErrorCode.INVALID_CREDENTIALS,
-                            "incorrect username or password");
-                }
-                return false;
-            }
-        }
-
-        private boolean crossDomainAuthenticationRequired(Response response) {
-            String realm = getRealmFromResponse(response);
-            if (realm == null) realm = "";
-            return !mLocalProfile.getSipDomain().trim().equals(realm.trim());
-        }
-
-        private AccountManager getAccountManager() {
-            return new AccountManager() {
-                public UserCredentials getCredentials(ClientTransaction
-                        challengedTransaction, String realm) {
-                    return new UserCredentials() {
-                        public String getUserName() {
-                            String username = mLocalProfile.getAuthUserName();
-                            return (!TextUtils.isEmpty(username) ? username :
-                                    mLocalProfile.getUserName());
-                        }
-
-                        public String getPassword() {
-                            return mPassword;
-                        }
-
-                        public String getSipDomain() {
-                            return mLocalProfile.getSipDomain();
-                        }
-                    };
-                }
-            };
-        }
-
-        private String getRealmFromResponse(Response response) {
-            WWWAuthenticate wwwAuth = (WWWAuthenticate)response.getHeader(
-                    SIPHeaderNames.WWW_AUTHENTICATE);
-            if (wwwAuth != null) return wwwAuth.getRealm();
-            ProxyAuthenticate proxyAuth = (ProxyAuthenticate)response.getHeader(
-                    SIPHeaderNames.PROXY_AUTHENTICATE);
-            return (proxyAuth == null) ? null : proxyAuth.getRealm();
-        }
-
-        private String getNonceFromResponse(Response response) {
-            WWWAuthenticate wwwAuth = (WWWAuthenticate)response.getHeader(
-                    SIPHeaderNames.WWW_AUTHENTICATE);
-            if (wwwAuth != null) return wwwAuth.getNonce();
-            ProxyAuthenticate proxyAuth = (ProxyAuthenticate)response.getHeader(
-                    SIPHeaderNames.PROXY_AUTHENTICATE);
-            return (proxyAuth == null) ? null : proxyAuth.getNonce();
-        }
-
-        private String getResponseString(int statusCode) {
-            StatusLine statusLine = new StatusLine();
-            statusLine.setStatusCode(statusCode);
-            statusLine.setReasonPhrase(SIPResponse.getReasonPhrase(statusCode));
-            return statusLine.encode();
-        }
-
-        private boolean readyForCall(EventObject evt) throws SipException {
-            // expect MakeCallCommand, RegisterCommand, DEREGISTER
-            if (evt instanceof MakeCallCommand) {
-                mState = SipSession.State.OUTGOING_CALL;
-                MakeCallCommand cmd = (MakeCallCommand) evt;
-                mPeerProfile = cmd.getPeerProfile();
-                if (mReferSession != null) {
-                    mSipHelper.sendReferNotify(mReferSession.mDialog,
-                            getResponseString(Response.TRYING));
-                }
-                mClientTransaction = mSipHelper.sendInvite(
-                        mLocalProfile, mPeerProfile, cmd.getSessionDescription(),
-                        generateTag(), mReferredBy, mReplaces);
-                mDialog = mClientTransaction.getDialog();
-                addSipSession(this);
-                startSessionTimer(cmd.getTimeout());
-                mProxy.onCalling(this);
-                return true;
-            } else if (evt instanceof RegisterCommand) {
-                mState = SipSession.State.REGISTERING;
-                int duration = ((RegisterCommand) evt).getDuration();
-                mClientTransaction = mSipHelper.sendRegister(mLocalProfile,
-                        generateTag(), duration);
-                mDialog = mClientTransaction.getDialog();
-                addSipSession(this);
-                mProxy.onRegistering(this);
-                return true;
-            } else if (DEREGISTER == evt) {
-                mState = SipSession.State.DEREGISTERING;
-                mClientTransaction = mSipHelper.sendRegister(mLocalProfile,
-                        generateTag(), 0);
-                mDialog = mClientTransaction.getDialog();
-                addSipSession(this);
-                mProxy.onRegistering(this);
-                return true;
-            }
-            return false;
-        }
-
-        private boolean incomingCall(EventObject evt) throws SipException {
-            // expect MakeCallCommand(answering) , END_CALL cmd , Cancel
-            if (evt instanceof MakeCallCommand) {
-                // answer call
-                mState = SipSession.State.INCOMING_CALL_ANSWERING;
-                mServerTransaction = mSipHelper.sendInviteOk(mInviteReceived,
-                        mLocalProfile,
-                        ((MakeCallCommand) evt).getSessionDescription(),
-                        mServerTransaction,
-                        mExternalIp, mExternalPort);
-                startSessionTimer(((MakeCallCommand) evt).getTimeout());
-                return true;
-            } else if (END_CALL == evt) {
-                mSipHelper.sendInviteBusyHere(mInviteReceived,
-                        mServerTransaction);
-                endCallNormally();
-                return true;
-            } else if (isRequestEvent(Request.CANCEL, evt)) {
-                RequestEvent event = (RequestEvent) evt;
-                mSipHelper.sendResponse(event, Response.OK);
-                mSipHelper.sendInviteRequestTerminated(
-                        mInviteReceived.getRequest(), mServerTransaction);
-                endCallNormally();
-                return true;
-            }
-            return false;
-        }
-
-        private boolean incomingCallToInCall(EventObject evt)
-                throws SipException {
-            // expect ACK, CANCEL request
-            if (isRequestEvent(Request.ACK, evt)) {
-                String sdp = extractContent(((RequestEvent) evt).getRequest());
-                if (sdp != null) mPeerSessionDescription = sdp;
-                if (mPeerSessionDescription == null) {
-                    onError(SipErrorCode.CLIENT_ERROR, "peer sdp is empty");
-                } else {
-                    establishCall(false);
-                }
-                return true;
-            } else if (isRequestEvent(Request.CANCEL, evt)) {
-                // http://tools.ietf.org/html/rfc3261#section-9.2
-                // Final response has been sent; do nothing here.
-                return true;
-            }
-            return false;
-        }
-
-        private boolean outgoingCall(EventObject evt) throws SipException {
-            if (expectResponse(Request.INVITE, evt)) {
-                ResponseEvent event = (ResponseEvent) evt;
-                Response response = event.getResponse();
-
-                int statusCode = response.getStatusCode();
-                switch (statusCode) {
-                case Response.RINGING:
-                case Response.CALL_IS_BEING_FORWARDED:
-                case Response.QUEUED:
-                case Response.SESSION_PROGRESS:
-                    // feedback any provisional responses (except TRYING) as
-                    // ring back for better UX
-                    if (mState == SipSession.State.OUTGOING_CALL) {
-                        mState = SipSession.State.OUTGOING_CALL_RING_BACK;
-                        cancelSessionTimer();
-                        mProxy.onRingingBack(this);
-                    }
-                    return true;
-                case Response.OK:
-                    if (mReferSession != null) {
-                        mSipHelper.sendReferNotify(mReferSession.mDialog,
-                                getResponseString(Response.OK));
-                        // since we don't need to remember the session anymore.
-                        mReferSession = null;
-                    }
-                    mSipHelper.sendInviteAck(event, mDialog);
-                    mPeerSessionDescription = extractContent(response);
-                    establishCall(true);
-                    return true;
-                case Response.UNAUTHORIZED:
-                case Response.PROXY_AUTHENTICATION_REQUIRED:
-                    if (handleAuthentication(event)) {
-                        addSipSession(this);
-                    }
-                    return true;
-                case Response.REQUEST_PENDING:
-                    // TODO:
-                    // rfc3261#section-14.1; re-schedule invite
-                    return true;
-                default:
-                    if (mReferSession != null) {
-                        mSipHelper.sendReferNotify(mReferSession.mDialog,
-                                getResponseString(Response.SERVICE_UNAVAILABLE));
-                    }
-                    if (statusCode >= 400) {
-                        // error: an ack is sent automatically by the stack
-                        onError(response);
-                        return true;
-                    } else if (statusCode >= 300) {
-                        // TODO: handle 3xx (redirect)
-                    } else {
-                        return true;
-                    }
-                }
-                return false;
-            } else if (END_CALL == evt) {
-                // RFC says that UA should not send out cancel when no
-                // response comes back yet. We are cheating for not checking
-                // response.
-                mState = SipSession.State.OUTGOING_CALL_CANCELING;
-                mSipHelper.sendCancel(mClientTransaction);
-                startSessionTimer(CANCEL_CALL_TIMER);
-                return true;
-            } else if (isRequestEvent(Request.INVITE, evt)) {
-                // Call self? Send BUSY HERE so server may redirect the call to
-                // voice mailbox.
-                RequestEvent event = (RequestEvent) evt;
-                mSipHelper.sendInviteBusyHere(event,
-                        event.getServerTransaction());
-                return true;
-            }
-            return false;
-        }
-
-        private boolean outgoingCallToReady(EventObject evt)
-                throws SipException {
-            if (evt instanceof ResponseEvent) {
-                ResponseEvent event = (ResponseEvent) evt;
-                Response response = event.getResponse();
-                int statusCode = response.getStatusCode();
-                if (expectResponse(Request.CANCEL, evt)) {
-                    if (statusCode == Response.OK) {
-                        // do nothing; wait for REQUEST_TERMINATED
-                        return true;
-                    }
-                } else if (expectResponse(Request.INVITE, evt)) {
-                    switch (statusCode) {
-                        case Response.OK:
-                            outgoingCall(evt); // abort Cancel
-                            return true;
-                        case Response.REQUEST_TERMINATED:
-                            endCallNormally();
-                            return true;
-                    }
-                } else {
-                    return false;
-                }
-
-                if (statusCode >= 400) {
-                    onError(response);
-                    return true;
-                }
-            } else if (evt instanceof TransactionTerminatedEvent) {
-                // rfc3261#section-14.1:
-                // if re-invite gets timed out, terminate the dialog; but
-                // re-invite is not reliable, just let it go and pretend
-                // nothing happened.
-                onError(new SipException("timed out"));
-            }
-            return false;
-        }
-
-        private boolean processReferRequest(RequestEvent event)
-                throws SipException {
-            try {
-                ReferToHeader referto = (ReferToHeader) event.getRequest()
-                        .getHeader(ReferTo.NAME);
-                Address address = referto.getAddress();
-                SipURI uri = (SipURI) address.getURI();
-                String replacesHeader = uri.getHeader(ReplacesHeader.NAME);
-                String username = uri.getUser();
-                if (username == null) {
-                    mSipHelper.sendResponse(event, Response.BAD_REQUEST);
-                    return false;
-                }
-                // send notify accepted
-                mSipHelper.sendResponse(event, Response.ACCEPTED);
-                SipSessionImpl newSession = createNewSession(event,
-                        this.mProxy.getListener(),
-                        mSipHelper.getServerTransaction(event),
-                        SipSession.State.READY_TO_CALL);
-                newSession.mReferSession = this;
-                newSession.mReferredBy = (ReferredByHeader) event.getRequest()
-                        .getHeader(ReferredByHeader.NAME);
-                newSession.mReplaces = replacesHeader;
-                newSession.mPeerProfile = createPeerProfile(referto);
-                newSession.mProxy.onCallTransferring(newSession,
-                        null);
-                return true;
-            } catch (IllegalArgumentException e) {
-                throw new SipException("createPeerProfile()", e);
-            }
-        }
-
-        private boolean inCall(EventObject evt) throws SipException {
-            // expect END_CALL cmd, BYE request, hold call (MakeCallCommand)
-            // OK retransmission is handled in SipStack
-            if (END_CALL == evt) {
-                // rfc3261#section-15.1.1
-                mState = SipSession.State.ENDING_CALL;
-                mSipHelper.sendBye(mDialog);
-                mProxy.onCallEnded(this);
-                startSessionTimer(END_CALL_TIMER);
-                return true;
-            } else if (isRequestEvent(Request.INVITE, evt)) {
-                // got Re-INVITE
-                mState = SipSession.State.INCOMING_CALL;
-                RequestEvent event = mInviteReceived = (RequestEvent) evt;
-                mPeerSessionDescription = extractContent(event.getRequest());
-                mServerTransaction = null;
-                mProxy.onRinging(this, mPeerProfile, mPeerSessionDescription);
-                return true;
-            } else if (isRequestEvent(Request.BYE, evt)) {
-                mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
-                endCallNormally();
-                return true;
-            } else if (isRequestEvent(Request.REFER, evt)) {
-                return processReferRequest((RequestEvent) evt);
-            } else if (evt instanceof MakeCallCommand) {
-                // to change call
-                mState = SipSession.State.OUTGOING_CALL;
-                mClientTransaction = mSipHelper.sendReinvite(mDialog,
-                        ((MakeCallCommand) evt).getSessionDescription());
-                startSessionTimer(((MakeCallCommand) evt).getTimeout());
-                return true;
-            } else if (evt instanceof ResponseEvent) {
-                if (expectResponse(Request.NOTIFY, evt)) return true;
-            }
-            return false;
-        }
-
-        private boolean endingCall(EventObject evt) throws SipException {
-            if (expectResponse(Request.BYE, evt)) {
-                ResponseEvent event = (ResponseEvent) evt;
-                Response response = event.getResponse();
-
-                int statusCode = response.getStatusCode();
-                switch (statusCode) {
-                    case Response.UNAUTHORIZED:
-                    case Response.PROXY_AUTHENTICATION_REQUIRED:
-                        if (handleAuthentication(event)) {
-                            return true;
-                        } else {
-                            // can't authenticate; pass through to end session
-                        }
-                }
-                cancelSessionTimer();
-                reset();
-                return true;
-            }
-            return false;
-        }
-
-        // timeout in seconds
-        private void startSessionTimer(int timeout) {
-            if (timeout > 0) {
-                mSessionTimer = new SessionTimer();
-                mSessionTimer.start(timeout);
-            }
-        }
-
-        private void cancelSessionTimer() {
-            if (mSessionTimer != null) {
-                mSessionTimer.cancel();
-                mSessionTimer = null;
-            }
-        }
-
-        private String createErrorMessage(Response response) {
-            return String.format("%s (%d)", response.getReasonPhrase(),
-                    response.getStatusCode());
-        }
-
-        private void enableKeepAlive() {
-            if (mKeepAliveSession != null) {
-                mKeepAliveSession.stopKeepAliveProcess();
-            } else {
-                mKeepAliveSession = duplicate();
-            }
-            try {
-                mKeepAliveSession.startKeepAliveProcess(
-                        INCALL_KEEPALIVE_INTERVAL, mPeerProfile, null);
-            } catch (SipException e) {
-                Log.w(TAG, "keepalive cannot be enabled; ignored", e);
-                mKeepAliveSession.stopKeepAliveProcess();
-            }
-        }
-
-        private void establishCall(boolean enableKeepAlive) {
-            mState = SipSession.State.IN_CALL;
-            cancelSessionTimer();
-            if (!mInCall && enableKeepAlive) enableKeepAlive();
-            mInCall = true;
-            mProxy.onCallEstablished(this, mPeerSessionDescription);
-        }
-
-        private void endCallNormally() {
-            reset();
-            mProxy.onCallEnded(this);
-        }
-
-        private void endCallOnError(int errorCode, String message) {
-            reset();
-            mProxy.onError(this, errorCode, message);
-        }
-
-        private void endCallOnBusy() {
-            reset();
-            mProxy.onCallBusy(this);
-        }
-
-        private void onError(int errorCode, String message) {
-            cancelSessionTimer();
-            switch (mState) {
-                case SipSession.State.REGISTERING:
-                case SipSession.State.DEREGISTERING:
-                    onRegistrationFailed(errorCode, message);
-                    break;
-                default:
-                    endCallOnError(errorCode, message);
-            }
-        }
-
-
-        private void onError(Throwable exception) {
-            exception = getRootCause(exception);
-            onError(getErrorCode(exception), exception.toString());
-        }
-
-        private void onError(Response response) {
-            int statusCode = response.getStatusCode();
-            if (!mInCall && (statusCode == Response.BUSY_HERE)) {
-                endCallOnBusy();
-            } else {
-                onError(getErrorCode(statusCode), createErrorMessage(response));
-            }
-        }
-
-        private int getErrorCode(int responseStatusCode) {
-            switch (responseStatusCode) {
-                case Response.TEMPORARILY_UNAVAILABLE:
-                case Response.FORBIDDEN:
-                case Response.GONE:
-                case Response.NOT_FOUND:
-                case Response.NOT_ACCEPTABLE:
-                case Response.NOT_ACCEPTABLE_HERE:
-                    return SipErrorCode.PEER_NOT_REACHABLE;
-
-                case Response.REQUEST_URI_TOO_LONG:
-                case Response.ADDRESS_INCOMPLETE:
-                case Response.AMBIGUOUS:
-                    return SipErrorCode.INVALID_REMOTE_URI;
-
-                case Response.REQUEST_TIMEOUT:
-                    return SipErrorCode.TIME_OUT;
-
-                default:
-                    if (responseStatusCode < 500) {
-                        return SipErrorCode.CLIENT_ERROR;
-                    } else {
-                        return SipErrorCode.SERVER_ERROR;
-                    }
-            }
-        }
-
-        private int getErrorCode(Throwable exception) {
-            String message = exception.getMessage();
-            if (exception instanceof UnknownHostException) {
-                return SipErrorCode.SERVER_UNREACHABLE;
-            } else if (exception instanceof IOException) {
-                return SipErrorCode.SOCKET_ERROR;
-            } else {
-                return SipErrorCode.CLIENT_ERROR;
-            }
-        }
-
-        private void onRegistrationDone(int duration) {
-            reset();
-            mProxy.onRegistrationDone(this, duration);
-        }
-
-        private void onRegistrationFailed(int errorCode, String message) {
-            reset();
-            mProxy.onRegistrationFailed(this, errorCode, message);
-        }
-
-        private void onRegistrationFailed(Throwable exception) {
-            exception = getRootCause(exception);
-            onRegistrationFailed(getErrorCode(exception),
-                    exception.toString());
-        }
-
-        private void onRegistrationFailed(Response response) {
-            int statusCode = response.getStatusCode();
-            onRegistrationFailed(getErrorCode(statusCode),
-                    createErrorMessage(response));
-        }
-
-        // Notes: SipSessionListener will be replaced by the keepalive process
-        // @param interval in seconds
-        public void startKeepAliveProcess(int interval,
-                KeepAliveProcessCallback callback) throws SipException {
-            synchronized (SipSessionGroup.this) {
-                startKeepAliveProcess(interval, mLocalProfile, callback);
-            }
-        }
-
-        // Notes: SipSessionListener will be replaced by the keepalive process
-        // @param interval in seconds
-        public void startKeepAliveProcess(int interval, SipProfile peerProfile,
-                KeepAliveProcessCallback callback) throws SipException {
-            synchronized (SipSessionGroup.this) {
-                if (mKeepAliveProcess != null) {
-                    throw new SipException("Cannot create more than one "
-                            + "keepalive process in a SipSession");
-                }
-                mPeerProfile = peerProfile;
-                mKeepAliveProcess = new KeepAliveProcess();
-                mProxy.setListener(mKeepAliveProcess);
-                mKeepAliveProcess.start(interval, callback);
-            }
-        }
-
-        public void stopKeepAliveProcess() {
-            synchronized (SipSessionGroup.this) {
-                if (mKeepAliveProcess != null) {
-                    mKeepAliveProcess.stop();
-                    mKeepAliveProcess = null;
-                }
-            }
-        }
-
-        class KeepAliveProcess extends SipSessionAdapter implements Runnable {
-            private static final String TAG = "SipKeepAlive";
-            private boolean mRunning = false;
-            private KeepAliveProcessCallback mCallback;
-
-            private boolean mPortChanged = false;
-            private int mRPort = 0;
-            private int mInterval; // just for debugging
-
-            // @param interval in seconds
-            void start(int interval, KeepAliveProcessCallback callback) {
-                if (mRunning) return;
-                mRunning = true;
-                mInterval = interval;
-                mCallback = new KeepAliveProcessCallbackProxy(callback);
-                mWakeupTimer.set(interval * 1000, this);
-                if (DEBUG) {
-                    Log.d(TAG, "start keepalive:"
-                            + mLocalProfile.getUriString());
-                }
-
-                // No need to run the first time in a separate thread for now
-                run();
-            }
-
-            // return true if the event is consumed
-            boolean process(EventObject evt) throws SipException {
-                if (mRunning && (mState == SipSession.State.PINGING)) {
-                    if (evt instanceof ResponseEvent) {
-                        if (parseOptionsResult(evt)) {
-                            if (mPortChanged) {
-                                resetExternalAddress();
-                                stop();
-                            } else {
-                                cancelSessionTimer();
-                                removeSipSession(SipSessionImpl.this);
-                            }
-                            mCallback.onResponse(mPortChanged);
-                            return true;
-                        }
-                    }
-                }
-                return false;
-            }
-
-            // SipSessionAdapter
-            // To react to the session timeout event and network error.
-            @Override
-            public void onError(ISipSession session, int errorCode, String message) {
-                stop();
-                mCallback.onError(errorCode, message);
-            }
-
-            // SipWakeupTimer timeout handler
-            // To send out keepalive message.
-            @Override
-            public void run() {
-                synchronized (SipSessionGroup.this) {
-                    if (!mRunning) return;
-
-                    if (DEBUG_PING) {
-                        String peerUri = (mPeerProfile == null)
-                                ? "null"
-                                : mPeerProfile.getUriString();
-                        Log.d(TAG, "keepalive: " + mLocalProfile.getUriString()
-                                + " --> " + peerUri + ", interval=" + mInterval);
-                    }
-                    try {
-                        sendKeepAlive();
-                    } catch (Throwable t) {
-                        if (DEBUG) {
-                            Log.w(TAG, "keepalive error: "
-                                    + mLocalProfile.getUriString(), getRootCause(t));
-                        }
-                        // It's possible that the keepalive process is being stopped
-                        // during session.sendKeepAlive() so need to check mRunning
-                        // again here.
-                        if (mRunning) SipSessionImpl.this.onError(t);
-                    }
-                }
-            }
-
-            void stop() {
-                synchronized (SipSessionGroup.this) {
-                    if (DEBUG) {
-                        Log.d(TAG, "stop keepalive:" + mLocalProfile.getUriString()
-                                + ",RPort=" + mRPort);
-                    }
-                    mRunning = false;
-                    mWakeupTimer.cancel(this);
-                    reset();
-                }
-            }
-
-            private void sendKeepAlive() throws SipException, InterruptedException {
-                synchronized (SipSessionGroup.this) {
-                    mState = SipSession.State.PINGING;
-                    mClientTransaction = mSipHelper.sendOptions(
-                            mLocalProfile, mPeerProfile, generateTag());
-                    mDialog = mClientTransaction.getDialog();
-                    addSipSession(SipSessionImpl.this);
-
-                    startSessionTimer(KEEPALIVE_TIMEOUT);
-                    // when timed out, onError() will be called with SipErrorCode.TIME_OUT
-                }
-            }
-
-            private boolean parseOptionsResult(EventObject evt) {
-                if (expectResponse(Request.OPTIONS, evt)) {
-                    ResponseEvent event = (ResponseEvent) evt;
-                    int rPort = getRPortFromResponse(event.getResponse());
-                    if (rPort != -1) {
-                        if (mRPort == 0) mRPort = rPort;
-                        if (mRPort != rPort) {
-                            mPortChanged = true;
-                            if (DEBUG) Log.d(TAG, String.format(
-                                    "rport is changed: %d <> %d", mRPort, rPort));
-                            mRPort = rPort;
-                        } else {
-                            if (DEBUG) Log.d(TAG, "rport is the same: " + rPort);
-                        }
-                    } else {
-                        if (DEBUG) Log.w(TAG, "peer did not respond rport");
-                    }
-                    return true;
-                }
-                return false;
-            }
-
-            private int getRPortFromResponse(Response response) {
-                ViaHeader viaHeader = (ViaHeader)(response.getHeader(
-                        SIPHeaderNames.VIA));
-                return (viaHeader == null) ? -1 : viaHeader.getRPort();
-            }
-        }
-    }
-
-    /**
-     * @return true if the event is a request event matching the specified
-     *      method; false otherwise
-     */
-    private static boolean isRequestEvent(String method, EventObject event) {
-        try {
-            if (event instanceof RequestEvent) {
-                RequestEvent requestEvent = (RequestEvent) event;
-                return method.equals(requestEvent.getRequest().getMethod());
-            }
-        } catch (Throwable e) {
-        }
-        return false;
-    }
-
-    private static String getCseqMethod(Message message) {
-        return ((CSeqHeader) message.getHeader(CSeqHeader.NAME)).getMethod();
-    }
-
-    /**
-     * @return true if the event is a response event and the CSeqHeader method
-     * match the given arguments; false otherwise
-     */
-    private static boolean expectResponse(
-            String expectedMethod, EventObject evt) {
-        if (evt instanceof ResponseEvent) {
-            ResponseEvent event = (ResponseEvent) evt;
-            Response response = event.getResponse();
-            return expectedMethod.equalsIgnoreCase(getCseqMethod(response));
-        }
-        return false;
-    }
-
-    /**
-     * @return true if the event is a response event and the response code and
-     *      CSeqHeader method match the given arguments; false otherwise
-     */
-    private static boolean expectResponse(
-            int responseCode, String expectedMethod, EventObject evt) {
-        if (evt instanceof ResponseEvent) {
-            ResponseEvent event = (ResponseEvent) evt;
-            Response response = event.getResponse();
-            if (response.getStatusCode() == responseCode) {
-                return expectedMethod.equalsIgnoreCase(getCseqMethod(response));
-            }
-        }
-        return false;
-    }
-
-    private static SipProfile createPeerProfile(HeaderAddress header)
-            throws SipException {
-        try {
-            Address address = header.getAddress();
-            SipURI uri = (SipURI) address.getURI();
-            String username = uri.getUser();
-            if (username == null) username = ANONYMOUS;
-            int port = uri.getPort();
-            SipProfile.Builder builder =
-                    new SipProfile.Builder(username, uri.getHost())
-                    .setDisplayName(address.getDisplayName());
-            if (port > 0) builder.setPort(port);
-            return builder.build();
-        } catch (IllegalArgumentException e) {
-            throw new SipException("createPeerProfile()", e);
-        } catch (ParseException e) {
-            throw new SipException("createPeerProfile()", e);
-        }
-    }
-
-    private static boolean isLoggable(SipSessionImpl s) {
-        if (s != null) {
-            switch (s.mState) {
-                case SipSession.State.PINGING:
-                    return DEBUG_PING;
-            }
-        }
-        return DEBUG;
-    }
-
-    private static boolean isLoggable(EventObject evt) {
-        return isLoggable(null, evt);
-    }
-
-    private static boolean isLoggable(SipSessionImpl s, EventObject evt) {
-        if (!isLoggable(s)) return false;
-        if (evt == null) return false;
-
-        if (evt instanceof ResponseEvent) {
-            Response response = ((ResponseEvent) evt).getResponse();
-            if (Request.OPTIONS.equals(response.getHeader(CSeqHeader.NAME))) {
-                return DEBUG_PING;
-            }
-            return DEBUG;
-        } else if (evt instanceof RequestEvent) {
-            if (isRequestEvent(Request.OPTIONS, evt)) {
-                return DEBUG_PING;
-            }
-            return DEBUG;
-        }
-        return false;
-    }
-
-    private static String log(EventObject evt) {
-        if (evt instanceof RequestEvent) {
-            return ((RequestEvent) evt).getRequest().toString();
-        } else if (evt instanceof ResponseEvent) {
-            return ((ResponseEvent) evt).getResponse().toString();
-        } else {
-            return evt.toString();
-        }
-    }
-
-    private class RegisterCommand extends EventObject {
-        private int mDuration;
-
-        public RegisterCommand(int duration) {
-            super(SipSessionGroup.this);
-            mDuration = duration;
-        }
-
-        public int getDuration() {
-            return mDuration;
-        }
-    }
-
-    private class MakeCallCommand extends EventObject {
-        private String mSessionDescription;
-        private int mTimeout; // in seconds
-
-        public MakeCallCommand(SipProfile peerProfile,
-                String sessionDescription) {
-            this(peerProfile, sessionDescription, -1);
-        }
-
-        public MakeCallCommand(SipProfile peerProfile,
-                String sessionDescription, int timeout) {
-            super(peerProfile);
-            mSessionDescription = sessionDescription;
-            mTimeout = timeout;
-        }
-
-        public SipProfile getPeerProfile() {
-            return (SipProfile) getSource();
-        }
-
-        public String getSessionDescription() {
-            return mSessionDescription;
-        }
-
-        public int getTimeout() {
-            return mTimeout;
-        }
-    }
-
-    /** Class to help safely run KeepAliveProcessCallback in a different thread. */
-    static class KeepAliveProcessCallbackProxy implements KeepAliveProcessCallback {
-        private KeepAliveProcessCallback mCallback;
-
-        KeepAliveProcessCallbackProxy(KeepAliveProcessCallback callback) {
-            mCallback = callback;
-        }
-
-        private void proxy(Runnable runnable) {
-            // One thread for each calling back.
-            // Note: Guarantee ordering if the issue becomes important. Currently,
-            // the chance of handling two callback events at a time is none.
-            new Thread(runnable, "SIP-KeepAliveProcessCallbackThread").start();
-        }
-
-        public void onResponse(final boolean portChanged) {
-            if (mCallback == null) return;
-            proxy(new Runnable() {
-                public void run() {
-                    try {
-                        mCallback.onResponse(portChanged);
-                    } catch (Throwable t) {
-                        Log.w(TAG, "onResponse", t);
-                    }
-                }
-            });
-        }
-
-        public void onError(final int errorCode, final String description) {
-            if (mCallback == null) return;
-            proxy(new Runnable() {
-                public void run() {
-                    try {
-                        mCallback.onError(errorCode, description);
-                    } catch (Throwable t) {
-                        Log.w(TAG, "onError", t);
-                    }
-                }
-            });
-        }
-    }
-}
diff --git a/voip/java/com/android/server/sip/SipSessionListenerProxy.java b/voip/java/com/android/server/sip/SipSessionListenerProxy.java
deleted file mode 100644
index 8655a3a..0000000
--- a/voip/java/com/android/server/sip/SipSessionListenerProxy.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2010 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.server.sip;
-
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipProfile;
-import android.os.DeadObjectException;
-import android.util.Log;
-
-/** Class to help safely run a callback in a different thread. */
-class SipSessionListenerProxy extends ISipSessionListener.Stub {
-    private static final String TAG = "SipSession";
-
-    private ISipSessionListener mListener;
-
-    public void setListener(ISipSessionListener listener) {
-        mListener = listener;
-    }
-
-    public ISipSessionListener getListener() {
-        return mListener;
-    }
-
-    private void proxy(Runnable runnable) {
-        // One thread for each calling back.
-        // Note: Guarantee ordering if the issue becomes important. Currently,
-        // the chance of handling two callback events at a time is none.
-        new Thread(runnable, "SipSessionCallbackThread").start();
-    }
-
-    public void onCalling(final ISipSession session) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onCalling(session);
-                } catch (Throwable t) {
-                    handle(t, "onCalling()");
-                }
-            }
-        });
-    }
-
-    public void onRinging(final ISipSession session, final SipProfile caller,
-            final String sessionDescription) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onRinging(session, caller, sessionDescription);
-                } catch (Throwable t) {
-                    handle(t, "onRinging()");
-                }
-            }
-        });
-    }
-
-    public void onRingingBack(final ISipSession session) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onRingingBack(session);
-                } catch (Throwable t) {
-                    handle(t, "onRingingBack()");
-                }
-            }
-        });
-    }
-
-    public void onCallEstablished(final ISipSession session,
-            final String sessionDescription) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onCallEstablished(session, sessionDescription);
-                } catch (Throwable t) {
-                    handle(t, "onCallEstablished()");
-                }
-            }
-        });
-    }
-
-    public void onCallEnded(final ISipSession session) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onCallEnded(session);
-                } catch (Throwable t) {
-                    handle(t, "onCallEnded()");
-                }
-            }
-        });
-    }
-
-    public void onCallTransferring(final ISipSession newSession,
-            final String sessionDescription) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onCallTransferring(newSession, sessionDescription);
-                } catch (Throwable t) {
-                    handle(t, "onCallTransferring()");
-                }
-            }
-        });
-    }
-
-    public void onCallBusy(final ISipSession session) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onCallBusy(session);
-                } catch (Throwable t) {
-                    handle(t, "onCallBusy()");
-                }
-            }
-        });
-    }
-
-    public void onCallChangeFailed(final ISipSession session,
-            final int errorCode, final String message) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onCallChangeFailed(session, errorCode, message);
-                } catch (Throwable t) {
-                    handle(t, "onCallChangeFailed()");
-                }
-            }
-        });
-    }
-
-    public void onError(final ISipSession session, final int errorCode,
-            final String message) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onError(session, errorCode, message);
-                } catch (Throwable t) {
-                    handle(t, "onError()");
-                }
-            }
-        });
-    }
-
-    public void onRegistering(final ISipSession session) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onRegistering(session);
-                } catch (Throwable t) {
-                    handle(t, "onRegistering()");
-                }
-            }
-        });
-    }
-
-    public void onRegistrationDone(final ISipSession session,
-            final int duration) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onRegistrationDone(session, duration);
-                } catch (Throwable t) {
-                    handle(t, "onRegistrationDone()");
-                }
-            }
-        });
-    }
-
-    public void onRegistrationFailed(final ISipSession session,
-            final int errorCode, final String message) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onRegistrationFailed(session, errorCode, message);
-                } catch (Throwable t) {
-                    handle(t, "onRegistrationFailed()");
-                }
-            }
-        });
-    }
-
-    public void onRegistrationTimeout(final ISipSession session) {
-        if (mListener == null) return;
-        proxy(new Runnable() {
-            public void run() {
-                try {
-                    mListener.onRegistrationTimeout(session);
-                } catch (Throwable t) {
-                    handle(t, "onRegistrationTimeout()");
-                }
-            }
-        });
-    }
-
-    private void handle(Throwable t, String message) {
-        if (t instanceof DeadObjectException) {
-            mListener = null;
-            // This creates race but it's harmless. Just don't log the error
-            // when it happens.
-        } else if (mListener != null) {
-            Log.w(TAG, message, t);
-        }
-    }
-}
diff --git a/voip/java/com/android/server/sip/SipWakeLock.java b/voip/java/com/android/server/sip/SipWakeLock.java
deleted file mode 100644
index 0c4d14c..0000000
--- a/voip/java/com/android/server/sip/SipWakeLock.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2010, 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.server.sip;
-
-import android.os.PowerManager;
-import android.util.Log;
-
-import java.util.HashSet;
-
-class SipWakeLock {
-    private static final boolean DEBUG = false;
-    private static final String TAG = "SipWakeLock";
-    private PowerManager mPowerManager;
-    private PowerManager.WakeLock mWakeLock;
-    private PowerManager.WakeLock mTimerWakeLock;
-    private HashSet<Object> mHolders = new HashSet<Object>();
-
-    SipWakeLock(PowerManager powerManager) {
-        mPowerManager = powerManager;
-    }
-
-    synchronized void reset() {
-        if (DEBUG) Log.v(TAG, "reset count=" + mHolders.size());
-        mHolders.clear();
-        release(null);
-    }
-
-    synchronized void acquire(long timeout) {
-        if (mTimerWakeLock == null) {
-            mTimerWakeLock = mPowerManager.newWakeLock(
-                    PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock.timer");
-            mTimerWakeLock.setReferenceCounted(true);
-        }
-        mTimerWakeLock.acquire(timeout);
-    }
-
-    synchronized void acquire(Object holder) {
-        mHolders.add(holder);
-        if (mWakeLock == null) {
-            mWakeLock = mPowerManager.newWakeLock(
-                    PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock");
-        }
-        if (!mWakeLock.isHeld()) mWakeLock.acquire();
-        if (DEBUG) Log.v(TAG, "acquire count=" + mHolders.size());
-    }
-
-    synchronized void release(Object holder) {
-        mHolders.remove(holder);
-        if ((mWakeLock != null) && mHolders.isEmpty()
-                && mWakeLock.isHeld()) {
-            mWakeLock.release();
-        }
-        if (DEBUG) Log.v(TAG, "release count=" + mHolders.size());
-    }
-}
diff --git a/voip/java/com/android/server/sip/SipWakeupTimer.java b/voip/java/com/android/server/sip/SipWakeupTimer.java
deleted file mode 100644
index 00d47ac..0000000
--- a/voip/java/com/android/server/sip/SipWakeupTimer.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * 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.server.sip;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.SystemClock;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeSet;
-import java.util.concurrent.Executor;
-import javax.sip.SipException;
-
-/**
- * Timer that can schedule events to occur even when the device is in sleep.
- */
-class SipWakeupTimer extends BroadcastReceiver {
-    private static final String TAG = "_SIP.WkTimer_";
-    private static final String TRIGGER_TIME = "TriggerTime";
-    private static final boolean DEBUG_TIMER = SipService.DEBUG && false;
-
-    private Context mContext;
-    private AlarmManager mAlarmManager;
-
-    // runnable --> time to execute in SystemClock
-    private TreeSet<MyEvent> mEventQueue =
-            new TreeSet<MyEvent>(new MyEventComparator());
-
-    private PendingIntent mPendingIntent;
-
-    private Executor mExecutor;
-
-    public SipWakeupTimer(Context context, Executor executor) {
-        mContext = context;
-        mAlarmManager = (AlarmManager)
-                context.getSystemService(Context.ALARM_SERVICE);
-
-        IntentFilter filter = new IntentFilter(getAction());
-        context.registerReceiver(this, filter);
-        mExecutor = executor;
-    }
-
-    /**
-     * Stops the timer. No event can be scheduled after this method is called.
-     */
-    public synchronized void stop() {
-        mContext.unregisterReceiver(this);
-        if (mPendingIntent != null) {
-            mAlarmManager.cancel(mPendingIntent);
-            mPendingIntent = null;
-        }
-        mEventQueue.clear();
-        mEventQueue = null;
-    }
-
-    private boolean stopped() {
-        if (mEventQueue == null) {
-            Log.w(TAG, "Timer stopped");
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    private void cancelAlarm() {
-        mAlarmManager.cancel(mPendingIntent);
-        mPendingIntent = null;
-    }
-
-    private void recalculatePeriods() {
-        if (mEventQueue.isEmpty()) return;
-
-        MyEvent firstEvent = mEventQueue.first();
-        int minPeriod = firstEvent.mMaxPeriod;
-        long minTriggerTime = firstEvent.mTriggerTime;
-        for (MyEvent e : mEventQueue) {
-            e.mPeriod = e.mMaxPeriod / minPeriod * minPeriod;
-            int interval = (int) (e.mLastTriggerTime + e.mMaxPeriod
-                    - minTriggerTime);
-            interval = interval / minPeriod * minPeriod;
-            e.mTriggerTime = minTriggerTime + interval;
-        }
-        TreeSet<MyEvent> newQueue = new TreeSet<MyEvent>(
-                mEventQueue.comparator());
-        newQueue.addAll((Collection<MyEvent>) mEventQueue);
-        mEventQueue.clear();
-        mEventQueue = newQueue;
-        if (DEBUG_TIMER) {
-            Log.d(TAG, "queue re-calculated");
-            printQueue();
-        }
-    }
-
-    // Determines the period and the trigger time of the new event and insert it
-    // to the queue.
-    private void insertEvent(MyEvent event) {
-        long now = SystemClock.elapsedRealtime();
-        if (mEventQueue.isEmpty()) {
-            event.mTriggerTime = now + event.mPeriod;
-            mEventQueue.add(event);
-            return;
-        }
-        MyEvent firstEvent = mEventQueue.first();
-        int minPeriod = firstEvent.mPeriod;
-        if (minPeriod <= event.mMaxPeriod) {
-            event.mPeriod = event.mMaxPeriod / minPeriod * minPeriod;
-            int interval = event.mMaxPeriod;
-            interval -= (int) (firstEvent.mTriggerTime - now);
-            interval = interval / minPeriod * minPeriod;
-            event.mTriggerTime = firstEvent.mTriggerTime + interval;
-            mEventQueue.add(event);
-        } else {
-            long triggerTime = now + event.mPeriod;
-            if (firstEvent.mTriggerTime < triggerTime) {
-                event.mTriggerTime = firstEvent.mTriggerTime;
-                event.mLastTriggerTime -= event.mPeriod;
-            } else {
-                event.mTriggerTime = triggerTime;
-            }
-            mEventQueue.add(event);
-            recalculatePeriods();
-        }
-    }
-
-    /**
-     * Sets a periodic timer.
-     *
-     * @param period the timer period; in milli-second
-     * @param callback is called back when the timer goes off; the same callback
-     *      can be specified in multiple timer events
-     */
-    public synchronized void set(int period, Runnable callback) {
-        if (stopped()) return;
-
-        long now = SystemClock.elapsedRealtime();
-        MyEvent event = new MyEvent(period, callback, now);
-        insertEvent(event);
-
-        if (mEventQueue.first() == event) {
-            if (mEventQueue.size() > 1) cancelAlarm();
-            scheduleNext();
-        }
-
-        long triggerTime = event.mTriggerTime;
-        if (DEBUG_TIMER) {
-            Log.d(TAG, " add event " + event + " scheduled on "
-                    + showTime(triggerTime) + " at " + showTime(now)
-                    + ", #events=" + mEventQueue.size());
-            printQueue();
-        }
-    }
-
-    /**
-     * Cancels all the timer events with the specified callback.
-     *
-     * @param callback the callback
-     */
-    public synchronized void cancel(Runnable callback) {
-        if (stopped() || mEventQueue.isEmpty()) return;
-        if (DEBUG_TIMER) Log.d(TAG, "cancel:" + callback);
-
-        MyEvent firstEvent = mEventQueue.first();
-        for (Iterator<MyEvent> iter = mEventQueue.iterator();
-                iter.hasNext();) {
-            MyEvent event = iter.next();
-            if (event.mCallback == callback) {
-                iter.remove();
-                if (DEBUG_TIMER) Log.d(TAG, "    cancel found:" + event);
-            }
-        }
-        if (mEventQueue.isEmpty()) {
-            cancelAlarm();
-        } else if (mEventQueue.first() != firstEvent) {
-            cancelAlarm();
-            firstEvent = mEventQueue.first();
-            firstEvent.mPeriod = firstEvent.mMaxPeriod;
-            firstEvent.mTriggerTime = firstEvent.mLastTriggerTime
-                    + firstEvent.mPeriod;
-            recalculatePeriods();
-            scheduleNext();
-        }
-        if (DEBUG_TIMER) {
-            Log.d(TAG, "after cancel:");
-            printQueue();
-        }
-    }
-
-    private void scheduleNext() {
-        if (stopped() || mEventQueue.isEmpty()) return;
-
-        if (mPendingIntent != null) {
-            throw new RuntimeException("pendingIntent is not null!");
-        }
-
-        MyEvent event = mEventQueue.first();
-        Intent intent = new Intent(getAction());
-        intent.putExtra(TRIGGER_TIME, event.mTriggerTime);
-        PendingIntent pendingIntent = mPendingIntent =
-                PendingIntent.getBroadcast(mContext, 0, intent,
-                        PendingIntent.FLAG_UPDATE_CURRENT);
-        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
-                event.mTriggerTime, pendingIntent);
-    }
-
-    @Override
-    public synchronized void onReceive(Context context, Intent intent) {
-        // This callback is already protected by AlarmManager's wake lock.
-        String action = intent.getAction();
-        if (getAction().equals(action)
-                && intent.getExtras().containsKey(TRIGGER_TIME)) {
-            mPendingIntent = null;
-            long triggerTime = intent.getLongExtra(TRIGGER_TIME, -1L);
-            execute(triggerTime);
-        } else {
-            Log.d(TAG, "unrecognized intent: " + intent);
-        }
-    }
-
-    private void printQueue() {
-        int count = 0;
-        for (MyEvent event : mEventQueue) {
-            Log.d(TAG, "     " + event + ": scheduled at "
-                    + showTime(event.mTriggerTime) + ": last at "
-                    + showTime(event.mLastTriggerTime));
-            if (++count >= 5) break;
-        }
-        if (mEventQueue.size() > count) {
-            Log.d(TAG, "     .....");
-        } else if (count == 0) {
-            Log.d(TAG, "     <empty>");
-        }
-    }
-
-    private void execute(long triggerTime) {
-        if (DEBUG_TIMER) Log.d(TAG, "time's up, triggerTime = "
-                + showTime(triggerTime) + ": " + mEventQueue.size());
-        if (stopped() || mEventQueue.isEmpty()) return;
-
-        for (MyEvent event : mEventQueue) {
-            if (event.mTriggerTime != triggerTime) continue;
-            if (DEBUG_TIMER) Log.d(TAG, "execute " + event);
-
-            event.mLastTriggerTime = triggerTime;
-            event.mTriggerTime += event.mPeriod;
-
-            // run the callback in the handler thread to prevent deadlock
-            mExecutor.execute(event.mCallback);
-        }
-        if (DEBUG_TIMER) {
-            Log.d(TAG, "after timeout execution");
-            printQueue();
-        }
-        scheduleNext();
-    }
-
-    private String getAction() {
-        return toString();
-    }
-
-    private String showTime(long time) {
-        int ms = (int) (time % 1000);
-        int s = (int) (time / 1000);
-        int m = s / 60;
-        s %= 60;
-        return String.format("%d.%d.%d", m, s, ms);
-    }
-
-    private static class MyEvent {
-        int mPeriod;
-        int mMaxPeriod;
-        long mTriggerTime;
-        long mLastTriggerTime;
-        Runnable mCallback;
-
-        MyEvent(int period, Runnable callback, long now) {
-            mPeriod = mMaxPeriod = period;
-            mCallback = callback;
-            mLastTriggerTime = now;
-        }
-
-        @Override
-        public String toString() {
-            String s = super.toString();
-            s = s.substring(s.indexOf("@"));
-            return s + ":" + (mPeriod / 1000) + ":" + (mMaxPeriod / 1000) + ":"
-                    + toString(mCallback);
-        }
-
-        private String toString(Object o) {
-            String s = o.toString();
-            int index = s.indexOf("$");
-            if (index > 0) s = s.substring(index + 1);
-            return s;
-        }
-    }
-
-    // Sort the events by mMaxPeriod so that the first event can be used to
-    // align events with larger periods
-    private static class MyEventComparator implements Comparator<MyEvent> {
-        public int compare(MyEvent e1, MyEvent e2) {
-            if (e1 == e2) return 0;
-            int diff = e1.mMaxPeriod - e2.mMaxPeriod;
-            if (diff == 0) diff = -1;
-            return diff;
-        }
-
-        public boolean equals(Object that) {
-            return (this == that);
-        }
-    }
-}
diff --git a/voip/jni/rtp/AmrCodec.cpp b/voip/jni/rtp/AmrCodec.cpp
deleted file mode 100644
index e2d820e..0000000
--- a/voip/jni/rtp/AmrCodec.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#include <string.h>
-
-#include "AudioCodec.h"
-
-#include "gsmamr_dec.h"
-#include "gsmamr_enc.h"
-
-namespace {
-
-const int gFrameBits[8] = {95, 103, 118, 134, 148, 159, 204, 244};
-
-//------------------------------------------------------------------------------
-
-// See RFC 4867 for the encoding details.
-
-class AmrCodec : public AudioCodec
-{
-public:
-    AmrCodec() {
-        if (AMREncodeInit(&mEncoder, &mSidSync, false)) {
-            mEncoder = NULL;
-        }
-        if (GSMInitDecode(&mDecoder, (Word8 *)"RTP")) {
-            mDecoder = NULL;
-        }
-    }
-
-    ~AmrCodec() {
-        if (mEncoder) {
-            AMREncodeExit(&mEncoder, &mSidSync);
-        }
-        if (mDecoder) {
-            GSMDecodeFrameExit(&mDecoder);
-        }
-    }
-
-    int set(int sampleRate, const char *fmtp);
-    int encode(void *payload, int16_t *samples);
-    int decode(int16_t *samples, int count, void *payload, int length);
-
-private:
-    void *mEncoder;
-    void *mSidSync;
-    void *mDecoder;
-
-    int mMode;
-    int mModeSet;
-    bool mOctetAligned;
-};
-
-int AmrCodec::set(int sampleRate, const char *fmtp)
-{
-    // These parameters are not supported.
-    if (strcasestr(fmtp, "crc=1") || strcasestr(fmtp, "robust-sorting=1") ||
-        strcasestr(fmtp, "interleaving=")) {
-        return -1;
-    }
-
-    // Handle mode-set and octet-align.
-    const char *modes = strcasestr(fmtp, "mode-set=");
-    if (modes) {
-        mMode = 0;
-        mModeSet = 0;
-        for (char c = *modes; c && c != ' '; c = *++modes) {
-            if (c >= '0' && c <= '7') {
-                int mode = c - '0';
-                if (mode > mMode) {
-                    mMode = mode;
-                }
-                mModeSet |= 1 << mode;
-            }
-        }
-    } else {
-        mMode = 7;
-        mModeSet = 0xFF;
-    }
-    mOctetAligned = (strcasestr(fmtp, "octet-align=1") != NULL);
-
-    // TODO: handle mode-change-*.
-
-    return (sampleRate == 8000 && mEncoder && mDecoder) ? 160 : -1;
-}
-
-int AmrCodec::encode(void *payload, int16_t *samples)
-{
-    unsigned char *bytes = (unsigned char *)payload;
-    Frame_Type_3GPP type;
-
-    int length = AMREncode(mEncoder, mSidSync, (Mode)mMode,
-        samples, bytes + 1, &type, AMR_TX_WMF);
-
-    if (type != mMode || length != (8 + gFrameBits[mMode] + 7) >> 3) {
-        return -1;
-    }
-
-    if (mOctetAligned) {
-        bytes[0] = 0xF0;
-        bytes[1] = (mMode << 3) | 0x04;
-        ++length;
-    } else {
-        // CMR = 15 (4-bit), F = 0 (1-bit), FT = mMode (4-bit), Q = 1 (1-bit).
-        bytes[0] = 0xFF;
-        bytes[1] = 0xC0 | (mMode << 1) | 1;
-
-        // Shift left 6 bits and update the length.
-        bytes[length + 1] = 0;
-        for (int i = 0; i <= length; ++i) {
-            bytes[i] = (bytes[i] << 6) | (bytes[i + 1] >> 2);
-        }
-        length = (10 + gFrameBits[mMode] + 7) >> 3;
-    }
-    return length;
-}
-
-int AmrCodec::decode(int16_t *samples, int count, void *payload, int length)
-{
-    unsigned char *bytes = (unsigned char *)payload;
-    Frame_Type_3GPP type;
-    if (length < 2) {
-        return -1;
-    }
-    int request = bytes[0] >> 4;
-
-    if (mOctetAligned) {
-        if ((bytes[1] & 0xC4) != 0x04) {
-            return -1;
-        }
-        type = (Frame_Type_3GPP)(bytes[1] >> 3);
-        if (length != (16 + gFrameBits[type] + 7) >> 3) {
-            return -1;
-        }
-        length -= 2;
-        bytes += 2;
-    } else {
-        if ((bytes[0] & 0x0C) || !(bytes[1] & 0x40)) {
-            return -1;
-        }
-        type = (Frame_Type_3GPP)((bytes[0] << 1 | bytes[1] >> 7) & 0x07);
-        if (length != (10 + gFrameBits[type] + 7) >> 3) {
-            return -1;
-        }
-
-        // Shift left 2 bits and update the length.
-        --length;
-        for (int i = 1; i < length; ++i) {
-            bytes[i] = (bytes[i] << 2) | (bytes[i + 1] >> 6);
-        }
-        bytes[length] <<= 2;
-        length = (gFrameBits[type] + 7) >> 3;
-        ++bytes;
-    }
-
-    if (AMRDecode(mDecoder, type, bytes, samples, MIME_IETF) != length) {
-        return -1;
-    }
-
-    // Handle CMR
-    if (request < 8 && request != mMode) {
-        for (int i = request; i >= 0; --i) {
-            if (mModeSet & (1 << i)) {
-                mMode = request;
-                break;
-            }
-        }
-    }
-
-    return 160;
-}
-
-//------------------------------------------------------------------------------
-
-// See RFC 3551 for the encoding details.
-
-class GsmEfrCodec : public AudioCodec
-{
-public:
-    GsmEfrCodec() {
-        if (AMREncodeInit(&mEncoder, &mSidSync, false)) {
-            mEncoder = NULL;
-        }
-        if (GSMInitDecode(&mDecoder, (Word8 *)"RTP")) {
-            mDecoder = NULL;
-        }
-    }
-
-    ~GsmEfrCodec() {
-        if (mEncoder) {
-            AMREncodeExit(&mEncoder, &mSidSync);
-        }
-        if (mDecoder) {
-            GSMDecodeFrameExit(&mDecoder);
-        }
-    }
-
-    int set(int sampleRate, const char *fmtp) {
-        return (sampleRate == 8000 && mEncoder && mDecoder) ? 160 : -1;
-    }
-
-    int encode(void *payload, int16_t *samples);
-    int decode(int16_t *samples, int count, void *payload, int length);
-
-private:
-    void *mEncoder;
-    void *mSidSync;
-    void *mDecoder;
-};
-
-int GsmEfrCodec::encode(void *payload, int16_t *samples)
-{
-    unsigned char *bytes = (unsigned char *)payload;
-    Frame_Type_3GPP type;
-
-    int length = AMREncode(mEncoder, mSidSync, MR122,
-        samples, bytes, &type, AMR_TX_WMF);
-
-    if (type == AMR_122 && length == 32) {
-        bytes[0] = 0xC0 | (bytes[1] >> 4);
-        for (int i = 1; i < 31; ++i) {
-            bytes[i] = (bytes[i] << 4) | (bytes[i + 1] >> 4);
-        }
-        return 31;
-    }
-    return -1;
-}
-
-int GsmEfrCodec::decode(int16_t *samples, int count, void *payload, int length)
-{
-    unsigned char *bytes = (unsigned char *)payload;
-    int n = 0;
-    while (n + 160 <= count && length >= 31 && (bytes[0] >> 4) == 0x0C) {
-        for (int i = 0; i < 30; ++i) {
-            bytes[i] = (bytes[i] << 4) | (bytes[i + 1] >> 4);
-        }
-        bytes[30] <<= 4;
-
-        if (AMRDecode(mDecoder, AMR_122, bytes, &samples[n], MIME_IETF) != 31) {
-            break;
-        }
-        n += 160;
-        length -= 31;
-        bytes += 31;
-    }
-    return n;
-}
-
-} // namespace
-
-AudioCodec *newAmrCodec()
-{
-    return new AmrCodec;
-}
-
-AudioCodec *newGsmEfrCodec()
-{
-    return new GsmEfrCodec;
-}
diff --git a/voip/jni/rtp/Android.mk b/voip/jni/rtp/Android.mk
deleted file mode 100644
index b265cdd..0000000
--- a/voip/jni/rtp/Android.mk
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-# Copyright (C) 2010 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.
-#
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := librtp_jni
-
-LOCAL_SRC_FILES := \
-	AudioCodec.cpp \
-	AudioGroup.cpp \
-	EchoSuppressor.cpp \
-	RtpStream.cpp \
-	util.cpp \
-	rtp_jni.cpp
-
-LOCAL_SRC_FILES += \
-	AmrCodec.cpp \
-	G711Codec.cpp \
-	GsmCodec.cpp
-
-LOCAL_SHARED_LIBRARIES := \
-	libnativehelper \
-	libcutils \
-	libutils \
-	libmedia \
-	libstagefright_amrnb_common
-
-LOCAL_STATIC_LIBRARIES := libgsm libstagefright_amrnbdec libstagefright_amrnbenc
-
-LOCAL_C_INCLUDES += \
-	$(JNI_H_INCLUDE) \
-	external/libgsm/inc \
-	frameworks/av/media/libstagefright/codecs/amrnb/common/include \
-	frameworks/av/media/libstagefright/codecs/amrnb/common/ \
-	frameworks/av/media/libstagefright/codecs/amrnb/enc/include \
-	frameworks/av/media/libstagefright/codecs/amrnb/enc/src \
-	frameworks/av/media/libstagefright/codecs/amrnb/dec/include \
-	frameworks/av/media/libstagefright/codecs/amrnb/dec/src \
-	$(call include-path-for, audio-effects)
-
-LOCAL_CFLAGS += -fvisibility=hidden
-
-
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/voip/jni/rtp/AudioCodec.cpp b/voip/jni/rtp/AudioCodec.cpp
deleted file mode 100644
index c75fbc9..0000000
--- a/voip/jni/rtp/AudioCodec.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#include <strings.h>
-
-#include "AudioCodec.h"
-
-extern AudioCodec *newAlawCodec();
-extern AudioCodec *newUlawCodec();
-extern AudioCodec *newGsmCodec();
-extern AudioCodec *newAmrCodec();
-extern AudioCodec *newGsmEfrCodec();
-
-struct AudioCodecType {
-    const char *name;
-    AudioCodec *(*create)();
-} gAudioCodecTypes[] = {
-    {"PCMA", newAlawCodec},
-    {"PCMU", newUlawCodec},
-    {"GSM", newGsmCodec},
-    {"AMR", newAmrCodec},
-    {"GSM-EFR", newGsmEfrCodec},
-    {NULL, NULL},
-};
-
-AudioCodec *newAudioCodec(const char *codecName)
-{
-    AudioCodecType *type = gAudioCodecTypes;
-    while (type->name != NULL) {
-        if (strcasecmp(codecName, type->name) == 0) {
-            AudioCodec *codec = type->create();
-            codec->name = type->name;
-            return codec;
-        }
-        ++type;
-    }
-    return NULL;
-}
diff --git a/voip/jni/rtp/AudioCodec.h b/voip/jni/rtp/AudioCodec.h
deleted file mode 100644
index 741730b..0000000
--- a/voip/jni/rtp/AudioCodec.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#include <stdint.h>
-
-#ifndef __AUDIO_CODEC_H__
-#define __AUDIO_CODEC_H__
-
-class AudioCodec
-{
-public:
-    const char *name;
-    // Needed by destruction through base class pointers.
-    virtual ~AudioCodec() {}
-    // Returns sampleCount or non-positive value if unsupported.
-    virtual int set(int sampleRate, const char *fmtp) = 0;
-    // Returns the length of payload in bytes.
-    virtual int encode(void *payload, int16_t *samples) = 0;
-    // Returns the number of decoded samples.
-    virtual int decode(int16_t *samples, int count, void *payload, int length) = 0;
-};
-
-AudioCodec *newAudioCodec(const char *codecName);
-
-#endif
diff --git a/voip/jni/rtp/AudioGroup.cpp b/voip/jni/rtp/AudioGroup.cpp
deleted file mode 100644
index 2f0829e..0000000
--- a/voip/jni/rtp/AudioGroup.cpp
+++ /dev/null
@@ -1,1073 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/epoll.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <time.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-// #define LOG_NDEBUG 0
-#define LOG_TAG "AudioGroup"
-#include <cutils/atomic.h>
-#include <cutils/properties.h>
-#include <utils/Log.h>
-#include <utils/Errors.h>
-#include <utils/RefBase.h>
-#include <utils/threads.h>
-#include <utils/SystemClock.h>
-#include <media/AudioSystem.h>
-#include <media/AudioRecord.h>
-#include <media/AudioTrack.h>
-#include <media/mediarecorder.h>
-#include <media/AudioEffect.h>
-#include <audio_effects/effect_aec.h>
-#include <system/audio.h>
-
-#include "jni.h"
-#include "JNIHelp.h"
-
-#include "AudioCodec.h"
-#include "EchoSuppressor.h"
-
-extern int parse(JNIEnv *env, jstring jAddress, int port, sockaddr_storage *ss);
-
-namespace {
-
-using namespace android;
-
-int gRandom = -1;
-
-// We use a circular array to implement jitter buffer. The simplest way is doing
-// a modulo operation on the index while accessing the array. However modulo can
-// be expensive on some platforms, such as ARM. Thus we round up the size of the
-// array to the nearest power of 2 and then use bitwise-and instead of modulo.
-// Currently we make it 2048ms long and assume packet interval is 50ms or less.
-// The first 100ms is the place where samples get mixed. The rest is the real
-// jitter buffer. For a stream at 8000Hz it takes 32 kilobytes. These numbers
-// are chosen by experiments and each of them can be adjusted as needed.
-
-// Originally a stream does not send packets when it is receive-only or there is
-// nothing to mix. However, this causes some problems with certain firewalls and
-// proxies. A firewall might remove a port mapping when there is no outgoing
-// packet for a preiod of time, and a proxy might wait for incoming packets from
-// both sides before start forwarding. To solve these problems, we send out a
-// silence packet on the stream for every second. It should be good enough to
-// keep the stream alive with relatively low resources.
-
-// Other notes:
-// + We use elapsedRealtime() to get the time. Since we use 32bit variables
-//   instead of 64bit ones, comparison must be done by subtraction.
-// + Sampling rate must be multiple of 1000Hz, and packet length must be in
-//   milliseconds. No floating points.
-// + If we cannot get enough CPU, we drop samples and simulate packet loss.
-// + Resampling is not done yet, so streams in one group must use the same rate.
-//   For the first release only 8000Hz is supported.
-
-#define BUFFER_SIZE     2048
-#define HISTORY_SIZE    100
-#define MEASURE_BASE    100
-#define MEASURE_PERIOD  5000
-#define DTMF_PERIOD     200
-
-class AudioStream
-{
-public:
-    AudioStream();
-    ~AudioStream();
-    bool set(int mode, int socket, sockaddr_storage *remote,
-        AudioCodec *codec, int sampleRate, int sampleCount,
-        int codecType, int dtmfType);
-
-    void sendDtmf(int event);
-    bool mix(int32_t *output, int head, int tail, int sampleRate);
-    void encode(int tick, AudioStream *chain);
-    void decode(int tick);
-
-private:
-    enum {
-        NORMAL = 0,
-        SEND_ONLY = 1,
-        RECEIVE_ONLY = 2,
-        LAST_MODE = 2,
-    };
-
-    int mMode;
-    int mSocket;
-    sockaddr_storage mRemote;
-    AudioCodec *mCodec;
-    uint32_t mCodecMagic;
-    uint32_t mDtmfMagic;
-    bool mFixRemote;
-
-    int mTick;
-    int mSampleRate;
-    int mSampleCount;
-    int mInterval;
-    int mKeepAlive;
-
-    int16_t *mBuffer;
-    int mBufferMask;
-    int mBufferHead;
-    int mBufferTail;
-    int mLatencyTimer;
-    int mLatencyScore;
-
-    uint16_t mSequence;
-    uint32_t mTimestamp;
-    uint32_t mSsrc;
-
-    int mDtmfEvent;
-    int mDtmfStart;
-
-    AudioStream *mNext;
-
-    friend class AudioGroup;
-};
-
-AudioStream::AudioStream()
-{
-    mSocket = -1;
-    mCodec = NULL;
-    mBuffer = NULL;
-    mNext = NULL;
-}
-
-AudioStream::~AudioStream()
-{
-    close(mSocket);
-    delete mCodec;
-    delete [] mBuffer;
-    ALOGD("stream[%d] is dead", mSocket);
-}
-
-bool AudioStream::set(int mode, int socket, sockaddr_storage *remote,
-    AudioCodec *codec, int sampleRate, int sampleCount,
-    int codecType, int dtmfType)
-{
-    if (mode < 0 || mode > LAST_MODE) {
-        return false;
-    }
-    mMode = mode;
-
-    mCodecMagic = (0x8000 | codecType) << 16;
-    mDtmfMagic = (dtmfType == -1) ? 0 : (0x8000 | dtmfType) << 16;
-
-    mTick = elapsedRealtime();
-    mSampleRate = sampleRate / 1000;
-    mSampleCount = sampleCount;
-    mInterval = mSampleCount / mSampleRate;
-
-    // Allocate jitter buffer.
-    for (mBufferMask = 8; mBufferMask < mSampleRate; mBufferMask <<= 1);
-    mBufferMask *= BUFFER_SIZE;
-    mBuffer = new int16_t[mBufferMask];
-    --mBufferMask;
-    mBufferHead = 0;
-    mBufferTail = 0;
-    mLatencyTimer = 0;
-    mLatencyScore = 0;
-
-    // Initialize random bits.
-    read(gRandom, &mSequence, sizeof(mSequence));
-    read(gRandom, &mTimestamp, sizeof(mTimestamp));
-    read(gRandom, &mSsrc, sizeof(mSsrc));
-
-    mDtmfEvent = -1;
-    mDtmfStart = 0;
-
-    // Only take over these things when succeeded.
-    mSocket = socket;
-    if (codec) {
-        mRemote = *remote;
-        mCodec = codec;
-
-        // Here we should never get an private address, but some buggy proxy
-        // servers do give us one. To solve this, we replace the address when
-        // the first time we successfully decode an incoming packet.
-        mFixRemote = false;
-        if (remote->ss_family == AF_INET) {
-            unsigned char *address =
-                (unsigned char *)&((sockaddr_in *)remote)->sin_addr;
-            if (address[0] == 10 ||
-                (address[0] == 172 && (address[1] >> 4) == 1) ||
-                (address[0] == 192 && address[1] == 168)) {
-                mFixRemote = true;
-            }
-        }
-    }
-
-    ALOGD("stream[%d] is configured as %s %dkHz %dms mode %d", mSocket,
-        (codec ? codec->name : "RAW"), mSampleRate, mInterval, mMode);
-    return true;
-}
-
-void AudioStream::sendDtmf(int event)
-{
-    if (mDtmfMagic != 0) {
-        mDtmfEvent = event << 24;
-        mDtmfStart = mTimestamp + mSampleCount;
-    }
-}
-
-bool AudioStream::mix(int32_t *output, int head, int tail, int sampleRate)
-{
-    if (mMode == SEND_ONLY) {
-        return false;
-    }
-
-    if (head - mBufferHead < 0) {
-        head = mBufferHead;
-    }
-    if (tail - mBufferTail > 0) {
-        tail = mBufferTail;
-    }
-    if (tail - head <= 0) {
-        return false;
-    }
-
-    head *= mSampleRate;
-    tail *= mSampleRate;
-
-    if (sampleRate == mSampleRate) {
-        for (int i = head; i - tail < 0; ++i) {
-            output[i - head] += mBuffer[i & mBufferMask];
-        }
-    } else {
-        // TODO: implement resampling.
-        return false;
-    }
-    return true;
-}
-
-void AudioStream::encode(int tick, AudioStream *chain)
-{
-    if (tick - mTick >= mInterval) {
-        // We just missed the train. Pretend that packets in between are lost.
-        int skipped = (tick - mTick) / mInterval;
-        mTick += skipped * mInterval;
-        mSequence += skipped;
-        mTimestamp += skipped * mSampleCount;
-        ALOGV("stream[%d] skips %d packets", mSocket, skipped);
-    }
-
-    tick = mTick;
-    mTick += mInterval;
-    ++mSequence;
-    mTimestamp += mSampleCount;
-
-    // If there is an ongoing DTMF event, send it now.
-    if (mMode != RECEIVE_ONLY && mDtmfEvent != -1) {
-        int duration = mTimestamp - mDtmfStart;
-        // Make sure duration is reasonable.
-        if (duration >= 0 && duration < mSampleRate * DTMF_PERIOD) {
-            duration += mSampleCount;
-            int32_t buffer[4] = {
-                htonl(mDtmfMagic | mSequence),
-                htonl(mDtmfStart),
-                mSsrc,
-                htonl(mDtmfEvent | duration),
-            };
-            if (duration >= mSampleRate * DTMF_PERIOD) {
-                buffer[3] |= htonl(1 << 23);
-                mDtmfEvent = -1;
-            }
-            sendto(mSocket, buffer, sizeof(buffer), MSG_DONTWAIT,
-                (sockaddr *)&mRemote, sizeof(mRemote));
-            return;
-        }
-        mDtmfEvent = -1;
-    }
-
-    int32_t buffer[mSampleCount + 3];
-    bool data = false;
-    if (mMode != RECEIVE_ONLY) {
-        // Mix all other streams.
-        memset(buffer, 0, sizeof(buffer));
-        while (chain) {
-            if (chain != this) {
-                data |= chain->mix(buffer, tick - mInterval, tick, mSampleRate);
-            }
-            chain = chain->mNext;
-        }
-    }
-
-    int16_t samples[mSampleCount];
-    if (data) {
-        // Saturate into 16 bits.
-        for (int i = 0; i < mSampleCount; ++i) {
-            int32_t sample = buffer[i];
-            if (sample < -32768) {
-                sample = -32768;
-            }
-            if (sample > 32767) {
-                sample = 32767;
-            }
-            samples[i] = sample;
-        }
-    } else {
-        if ((mTick ^ mKeepAlive) >> 10 == 0) {
-            return;
-        }
-        mKeepAlive = mTick;
-        memset(samples, 0, sizeof(samples));
-
-        if (mMode != RECEIVE_ONLY) {
-            ALOGV("stream[%d] no data", mSocket);
-        }
-    }
-
-    if (!mCodec) {
-        // Special case for device stream.
-        send(mSocket, samples, sizeof(samples), MSG_DONTWAIT);
-        return;
-    }
-
-    // Cook the packet and send it out.
-    buffer[0] = htonl(mCodecMagic | mSequence);
-    buffer[1] = htonl(mTimestamp);
-    buffer[2] = mSsrc;
-    int length = mCodec->encode(&buffer[3], samples);
-    if (length <= 0) {
-        ALOGV("stream[%d] encoder error", mSocket);
-        return;
-    }
-    sendto(mSocket, buffer, length + 12, MSG_DONTWAIT, (sockaddr *)&mRemote,
-        sizeof(mRemote));
-}
-
-void AudioStream::decode(int tick)
-{
-    char c;
-    if (mMode == SEND_ONLY) {
-        recv(mSocket, &c, 1, MSG_DONTWAIT);
-        return;
-    }
-
-    // Make sure mBufferHead and mBufferTail are reasonable.
-    if ((unsigned int)(tick + BUFFER_SIZE - mBufferHead) > BUFFER_SIZE * 2) {
-        mBufferHead = tick - HISTORY_SIZE;
-        mBufferTail = mBufferHead;
-    }
-
-    if (tick - mBufferHead > HISTORY_SIZE) {
-        // Throw away outdated samples.
-        mBufferHead = tick - HISTORY_SIZE;
-        if (mBufferTail - mBufferHead < 0) {
-            mBufferTail = mBufferHead;
-        }
-    }
-
-    // Adjust the jitter buffer if the latency keeps larger than the threshold
-    // in the measurement period.
-    int score = mBufferTail - tick - MEASURE_BASE;
-    if (mLatencyScore > score || mLatencyScore <= 0) {
-        mLatencyScore = score;
-        mLatencyTimer = tick;
-    } else if (tick - mLatencyTimer >= MEASURE_PERIOD) {
-        ALOGV("stream[%d] reduces latency of %dms", mSocket, mLatencyScore);
-        mBufferTail -= mLatencyScore;
-        mLatencyScore = -1;
-    }
-
-    int count = (BUFFER_SIZE - (mBufferTail - mBufferHead)) * mSampleRate;
-    if (count < mSampleCount) {
-        // Buffer overflow. Drop the packet.
-        ALOGV("stream[%d] buffer overflow", mSocket);
-        recv(mSocket, &c, 1, MSG_DONTWAIT);
-        return;
-    }
-
-    // Receive the packet and decode it.
-    int16_t samples[count];
-    if (!mCodec) {
-        // Special case for device stream.
-        count = recv(mSocket, samples, sizeof(samples),
-            MSG_TRUNC | MSG_DONTWAIT) >> 1;
-    } else {
-        __attribute__((aligned(4))) uint8_t buffer[2048];
-        sockaddr_storage remote;
-        socklen_t addrlen = sizeof(remote);
-
-        int length = recvfrom(mSocket, buffer, sizeof(buffer),
-            MSG_TRUNC | MSG_DONTWAIT, (sockaddr *)&remote, &addrlen);
-
-        // Do we need to check SSRC, sequence, and timestamp? They are not
-        // reliable but at least they can be used to identify duplicates?
-        if (length < 12 || length > (int)sizeof(buffer) ||
-            (ntohl(*(uint32_t *)buffer) & 0xC07F0000) != mCodecMagic) {
-            ALOGV("stream[%d] malformed packet", mSocket);
-            return;
-        }
-        int offset = 12 + ((buffer[0] & 0x0F) << 2);
-        if ((buffer[0] & 0x10) != 0) {
-            offset += 4 + (ntohs(*(uint16_t *)&buffer[offset + 2]) << 2);
-        }
-        if ((buffer[0] & 0x20) != 0) {
-            length -= buffer[length - 1];
-        }
-        length -= offset;
-        if (length >= 0) {
-            length = mCodec->decode(samples, count, &buffer[offset], length);
-        }
-        if (length > 0 && mFixRemote) {
-            mRemote = remote;
-            mFixRemote = false;
-        }
-        count = length;
-    }
-    if (count <= 0) {
-        ALOGV("stream[%d] decoder error", mSocket);
-        return;
-    }
-
-    if (tick - mBufferTail > 0) {
-        // Buffer underrun. Reset the jitter buffer.
-        ALOGV("stream[%d] buffer underrun", mSocket);
-        if (mBufferTail - mBufferHead <= 0) {
-            mBufferHead = tick + mInterval;
-            mBufferTail = mBufferHead;
-        } else {
-            int tail = (tick + mInterval) * mSampleRate;
-            for (int i = mBufferTail * mSampleRate; i - tail < 0; ++i) {
-                mBuffer[i & mBufferMask] = 0;
-            }
-            mBufferTail = tick + mInterval;
-        }
-    }
-
-    // Append to the jitter buffer.
-    int tail = mBufferTail * mSampleRate;
-    for (int i = 0; i < count; ++i) {
-        mBuffer[tail & mBufferMask] = samples[i];
-        ++tail;
-    }
-    mBufferTail += mInterval;
-}
-
-//------------------------------------------------------------------------------
-
-class AudioGroup
-{
-public:
-    AudioGroup();
-    ~AudioGroup();
-    bool set(int sampleRate, int sampleCount);
-
-    bool setMode(int mode);
-    bool sendDtmf(int event);
-    bool add(AudioStream *stream);
-    bool remove(AudioStream *stream);
-    bool platformHasAec() { return mPlatformHasAec; }
-
-private:
-    enum {
-        ON_HOLD = 0,
-        MUTED = 1,
-        NORMAL = 2,
-        ECHO_SUPPRESSION = 3,
-        LAST_MODE = 3,
-    };
-
-    bool checkPlatformAec();
-
-    AudioStream *mChain;
-    int mEventQueue;
-    volatile int mDtmfEvent;
-
-    int mMode;
-    int mSampleRate;
-    int mSampleCount;
-    int mDeviceSocket;
-    bool mPlatformHasAec;
-
-    class NetworkThread : public Thread
-    {
-    public:
-        NetworkThread(AudioGroup *group) : Thread(false), mGroup(group) {}
-
-        bool start()
-        {
-            if (run("Network", ANDROID_PRIORITY_AUDIO) != NO_ERROR) {
-                ALOGE("cannot start network thread");
-                return false;
-            }
-            return true;
-        }
-
-    private:
-        AudioGroup *mGroup;
-        bool threadLoop();
-    };
-    sp<NetworkThread> mNetworkThread;
-
-    class DeviceThread : public Thread
-    {
-    public:
-        DeviceThread(AudioGroup *group) : Thread(false), mGroup(group) {}
-
-        bool start()
-        {
-            if (run("Device", ANDROID_PRIORITY_AUDIO) != NO_ERROR) {
-                ALOGE("cannot start device thread");
-                return false;
-            }
-            return true;
-        }
-
-    private:
-        AudioGroup *mGroup;
-        bool threadLoop();
-    };
-    sp<DeviceThread> mDeviceThread;
-};
-
-AudioGroup::AudioGroup()
-{
-    mMode = ON_HOLD;
-    mChain = NULL;
-    mEventQueue = -1;
-    mDtmfEvent = -1;
-    mDeviceSocket = -1;
-    mNetworkThread = new NetworkThread(this);
-    mDeviceThread = new DeviceThread(this);
-    mPlatformHasAec = checkPlatformAec();
-}
-
-AudioGroup::~AudioGroup()
-{
-    mNetworkThread->requestExitAndWait();
-    mDeviceThread->requestExitAndWait();
-    close(mEventQueue);
-    close(mDeviceSocket);
-    while (mChain) {
-        AudioStream *next = mChain->mNext;
-        delete mChain;
-        mChain = next;
-    }
-    ALOGD("group[%d] is dead", mDeviceSocket);
-}
-
-bool AudioGroup::set(int sampleRate, int sampleCount)
-{
-    mEventQueue = epoll_create(2);
-    if (mEventQueue == -1) {
-        ALOGE("epoll_create: %s", strerror(errno));
-        return false;
-    }
-
-    mSampleRate = sampleRate;
-    mSampleCount = sampleCount;
-
-    // Create device socket.
-    int pair[2];
-    if (socketpair(AF_UNIX, SOCK_DGRAM, 0, pair)) {
-        ALOGE("socketpair: %s", strerror(errno));
-        return false;
-    }
-    mDeviceSocket = pair[0];
-
-    // Create device stream.
-    mChain = new AudioStream;
-    if (!mChain->set(AudioStream::NORMAL, pair[1], NULL, NULL,
-        sampleRate, sampleCount, -1, -1)) {
-        close(pair[1]);
-        ALOGE("cannot initialize device stream");
-        return false;
-    }
-
-    // Give device socket a reasonable timeout.
-    timeval tv;
-    tv.tv_sec = 0;
-    tv.tv_usec = 1000 * sampleCount / sampleRate * 500;
-    if (setsockopt(pair[0], SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) {
-        ALOGE("setsockopt: %s", strerror(errno));
-        return false;
-    }
-
-    // Add device stream into event queue.
-    epoll_event event;
-    event.events = EPOLLIN;
-    event.data.ptr = mChain;
-    if (epoll_ctl(mEventQueue, EPOLL_CTL_ADD, pair[1], &event)) {
-        ALOGE("epoll_ctl: %s", strerror(errno));
-        return false;
-    }
-
-    // Anything else?
-    ALOGD("stream[%d] joins group[%d]", pair[1], pair[0]);
-    return true;
-}
-
-bool AudioGroup::setMode(int mode)
-{
-    if (mode < 0 || mode > LAST_MODE) {
-        return false;
-    }
-    // FIXME: temporary code to overcome echo and mic gain issues on herring and tuna boards.
-    // Must be modified/removed when the root cause of the issue is fixed in the hardware or
-    // driver
-    char value[PROPERTY_VALUE_MAX];
-    property_get("ro.product.board", value, "");
-    if (mode == NORMAL &&
-            (!strcmp(value, "herring") || !strcmp(value, "tuna"))) {
-        mode = ECHO_SUPPRESSION;
-    }
-    if (mMode == mode) {
-        return true;
-    }
-
-    mDeviceThread->requestExitAndWait();
-    ALOGD("group[%d] switches from mode %d to %d", mDeviceSocket, mMode, mode);
-    mMode = mode;
-    return (mode == ON_HOLD) || mDeviceThread->start();
-}
-
-bool AudioGroup::sendDtmf(int event)
-{
-    if (event < 0 || event > 15) {
-        return false;
-    }
-
-    // DTMF is rarely used, so we try to make it as lightweight as possible.
-    // Using volatile might be dodgy, but using a pipe or pthread primitives
-    // or stop-set-restart threads seems too heavy. Will investigate later.
-    timespec ts;
-    ts.tv_sec = 0;
-    ts.tv_nsec = 100000000;
-    for (int i = 0; mDtmfEvent != -1 && i < 20; ++i) {
-        nanosleep(&ts, NULL);
-    }
-    if (mDtmfEvent != -1) {
-        return false;
-    }
-    mDtmfEvent = event;
-    nanosleep(&ts, NULL);
-    return true;
-}
-
-bool AudioGroup::add(AudioStream *stream)
-{
-    mNetworkThread->requestExitAndWait();
-
-    epoll_event event;
-    event.events = EPOLLIN;
-    event.data.ptr = stream;
-    if (epoll_ctl(mEventQueue, EPOLL_CTL_ADD, stream->mSocket, &event)) {
-        ALOGE("epoll_ctl: %s", strerror(errno));
-        return false;
-    }
-
-    stream->mNext = mChain->mNext;
-    mChain->mNext = stream;
-    if (!mNetworkThread->start()) {
-        // Only take over the stream when succeeded.
-        mChain->mNext = stream->mNext;
-        return false;
-    }
-
-    ALOGD("stream[%d] joins group[%d]", stream->mSocket, mDeviceSocket);
-    return true;
-}
-
-bool AudioGroup::remove(AudioStream *stream)
-{
-    mNetworkThread->requestExitAndWait();
-
-    for (AudioStream *chain = mChain; chain->mNext; chain = chain->mNext) {
-        if (chain->mNext == stream) {
-            if (epoll_ctl(mEventQueue, EPOLL_CTL_DEL, stream->mSocket, NULL)) {
-                ALOGE("epoll_ctl: %s", strerror(errno));
-                return false;
-            }
-            chain->mNext = stream->mNext;
-            ALOGD("stream[%d] leaves group[%d]", stream->mSocket, mDeviceSocket);
-            delete stream;
-            break;
-        }
-    }
-
-    // Do not start network thread if there is only one stream.
-    if (!mChain->mNext || !mNetworkThread->start()) {
-        return false;
-    }
-    return true;
-}
-
-bool AudioGroup::NetworkThread::threadLoop()
-{
-    AudioStream *chain = mGroup->mChain;
-    int tick = elapsedRealtime();
-    int deadline = tick + 10;
-    int count = 0;
-
-    for (AudioStream *stream = chain; stream; stream = stream->mNext) {
-        if (tick - stream->mTick >= 0) {
-            stream->encode(tick, chain);
-        }
-        if (deadline - stream->mTick > 0) {
-            deadline = stream->mTick;
-        }
-        ++count;
-    }
-
-    int event = mGroup->mDtmfEvent;
-    if (event != -1) {
-        for (AudioStream *stream = chain; stream; stream = stream->mNext) {
-            stream->sendDtmf(event);
-        }
-        mGroup->mDtmfEvent = -1;
-    }
-
-    deadline -= tick;
-    if (deadline < 1) {
-        deadline = 1;
-    }
-
-    epoll_event events[count];
-    count = epoll_wait(mGroup->mEventQueue, events, count, deadline);
-    if (count == -1) {
-        ALOGE("epoll_wait: %s", strerror(errno));
-        return false;
-    }
-    for (int i = 0; i < count; ++i) {
-        ((AudioStream *)events[i].data.ptr)->decode(tick);
-    }
-
-    return true;
-}
-
-bool AudioGroup::checkPlatformAec()
-{
-    effect_descriptor_t fxDesc;
-    uint32_t numFx;
-
-    if (AudioEffect::queryNumberEffects(&numFx) != NO_ERROR) {
-        return false;
-    }
-    for (uint32_t i = 0; i < numFx; i++) {
-        if (AudioEffect::queryEffect(i, &fxDesc) != NO_ERROR) {
-            continue;
-        }
-        if (memcmp(&fxDesc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) {
-            return true;
-        }
-    }
-    return false;
-}
-
-bool AudioGroup::DeviceThread::threadLoop()
-{
-    int mode = mGroup->mMode;
-    int sampleRate = mGroup->mSampleRate;
-    int sampleCount = mGroup->mSampleCount;
-    int deviceSocket = mGroup->mDeviceSocket;
-
-    // Find out the frame count for AudioTrack and AudioRecord.
-    size_t output = 0;
-    size_t input = 0;
-    if (AudioTrack::getMinFrameCount(&output, AUDIO_STREAM_VOICE_CALL,
-        sampleRate) != NO_ERROR || output <= 0 ||
-        AudioRecord::getMinFrameCount(&input, sampleRate,
-        AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_MONO) != NO_ERROR || input <= 0) {
-        ALOGE("cannot compute frame count");
-        return false;
-    }
-    ALOGD("reported frame count: output %d, input %d", output, input);
-
-    if (output < sampleCount * 2) {
-        output = sampleCount * 2;
-    }
-    if (input < sampleCount * 2) {
-        input = sampleCount * 2;
-    }
-    ALOGD("adjusted frame count: output %d, input %d", output, input);
-
-    // Initialize AudioTrack and AudioRecord.
-    AudioTrack track;
-    AudioRecord record;
-    if (track.set(AUDIO_STREAM_VOICE_CALL, sampleRate, AUDIO_FORMAT_PCM_16_BIT,
-                AUDIO_CHANNEL_OUT_MONO, output) != NO_ERROR ||
-            record.set(AUDIO_SOURCE_VOICE_COMMUNICATION, sampleRate, AUDIO_FORMAT_PCM_16_BIT,
-                AUDIO_CHANNEL_IN_MONO, input) != NO_ERROR) {
-        ALOGE("cannot initialize audio device");
-        return false;
-    }
-    ALOGD("latency: output %d, input %d", track.latency(), record.latency());
-
-    // Give device socket a reasonable buffer size.
-    setsockopt(deviceSocket, SOL_SOCKET, SO_RCVBUF, &output, sizeof(output));
-    setsockopt(deviceSocket, SOL_SOCKET, SO_SNDBUF, &output, sizeof(output));
-
-    // Drain device socket.
-    char c;
-    while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1);
-
-    // check if platform supports echo cancellation and do not active local echo suppression in
-    // this case
-    EchoSuppressor *echo = NULL;
-    AudioEffect *aec = NULL;
-    if (mode == ECHO_SUPPRESSION) {
-        if (mGroup->platformHasAec()) {
-            aec = new AudioEffect(FX_IID_AEC,
-                                    NULL,
-                                    0,
-                                    0,
-                                    0,
-                                    record.getSessionId(),
-                                    record.getInput());
-            status_t status = aec->initCheck();
-            if (status == NO_ERROR || status == ALREADY_EXISTS) {
-                aec->setEnabled(true);
-            } else {
-                delete aec;
-                aec = NULL;
-            }
-        }
-        // Create local echo suppressor if platform AEC cannot be used.
-        if (aec == NULL) {
-             echo = new EchoSuppressor(sampleCount,
-                                       (track.latency() + record.latency()) * sampleRate / 1000);
-        }
-    }
-    // Start AudioRecord before AudioTrack. This prevents AudioTrack from being
-    // disabled due to buffer underrun while waiting for AudioRecord.
-    if (mode != MUTED) {
-        record.start();
-        int16_t one;
-        record.read(&one, sizeof(one));
-    }
-    track.start();
-
-    while (!exitPending()) {
-        int16_t output[sampleCount];
-        if (recv(deviceSocket, output, sizeof(output), 0) <= 0) {
-            memset(output, 0, sizeof(output));
-        }
-
-        int16_t input[sampleCount];
-        int toWrite = sampleCount;
-        int toRead = (mode == MUTED) ? 0 : sampleCount;
-        int chances = 100;
-
-        while (--chances > 0 && (toWrite > 0 || toRead > 0)) {
-            if (toWrite > 0) {
-                AudioTrack::Buffer buffer;
-                buffer.frameCount = toWrite;
-
-                status_t status = track.obtainBuffer(&buffer, 1);
-                if (status == NO_ERROR) {
-                    int offset = sampleCount - toWrite;
-                    memcpy(buffer.i8, &output[offset], buffer.size);
-                    toWrite -= buffer.frameCount;
-                    track.releaseBuffer(&buffer);
-                } else if (status != TIMED_OUT && status != WOULD_BLOCK) {
-                    ALOGE("cannot write to AudioTrack");
-                    goto exit;
-                }
-            }
-
-            if (toRead > 0) {
-                AudioRecord::Buffer buffer;
-                buffer.frameCount = toRead;
-
-                status_t status = record.obtainBuffer(&buffer, 1);
-                if (status == NO_ERROR) {
-                    int offset = sampleCount - toRead;
-                    memcpy(&input[offset], buffer.i8, buffer.size);
-                    toRead -= buffer.frameCount;
-                    record.releaseBuffer(&buffer);
-                } else if (status != TIMED_OUT && status != WOULD_BLOCK) {
-                    ALOGE("cannot read from AudioRecord");
-                    goto exit;
-                }
-            }
-        }
-
-        if (chances <= 0) {
-            ALOGW("device loop timeout");
-            while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1);
-        }
-
-        if (mode != MUTED) {
-            if (echo != NULL) {
-                ALOGV("echo->run()");
-                echo->run(output, input);
-            }
-            send(deviceSocket, input, sizeof(input), MSG_DONTWAIT);
-        }
-    }
-
-exit:
-    delete echo;
-    delete aec;
-    return true;
-}
-
-//------------------------------------------------------------------------------
-
-static jfieldID gNative;
-static jfieldID gMode;
-
-int add(JNIEnv *env, jobject thiz, jint mode,
-    jint socket, jstring jRemoteAddress, jint remotePort,
-    jstring jCodecSpec, jint dtmfType)
-{
-    AudioCodec *codec = NULL;
-    AudioStream *stream = NULL;
-    AudioGroup *group = NULL;
-
-    // Sanity check.
-    sockaddr_storage remote;
-    if (parse(env, jRemoteAddress, remotePort, &remote) < 0) {
-        // Exception already thrown.
-        return 0;
-    }
-    if (!jCodecSpec) {
-        jniThrowNullPointerException(env, "codecSpec");
-        return 0;
-    }
-    const char *codecSpec = env->GetStringUTFChars(jCodecSpec, NULL);
-    if (!codecSpec) {
-        // Exception already thrown.
-        return 0;
-    }
-    socket = dup(socket);
-    if (socket == -1) {
-        jniThrowException(env, "java/lang/IllegalStateException",
-            "cannot get stream socket");
-        return 0;
-    }
-
-    // Create audio codec.
-    int codecType = -1;
-    char codecName[16];
-    int sampleRate = -1;
-    sscanf(codecSpec, "%d %15[^/]%*c%d", &codecType, codecName, &sampleRate);
-    codec = newAudioCodec(codecName);
-    int sampleCount = (codec ? codec->set(sampleRate, codecSpec) : -1);
-    env->ReleaseStringUTFChars(jCodecSpec, codecSpec);
-    if (sampleCount <= 0) {
-        jniThrowException(env, "java/lang/IllegalStateException",
-            "cannot initialize audio codec");
-        goto error;
-    }
-
-    // Create audio stream.
-    stream = new AudioStream;
-    if (!stream->set(mode, socket, &remote, codec, sampleRate, sampleCount,
-        codecType, dtmfType)) {
-        jniThrowException(env, "java/lang/IllegalStateException",
-            "cannot initialize audio stream");
-        goto error;
-    }
-    socket = -1;
-    codec = NULL;
-
-    // Create audio group.
-    group = (AudioGroup *)env->GetIntField(thiz, gNative);
-    if (!group) {
-        int mode = env->GetIntField(thiz, gMode);
-        group = new AudioGroup;
-        if (!group->set(8000, 256) || !group->setMode(mode)) {
-            jniThrowException(env, "java/lang/IllegalStateException",
-                "cannot initialize audio group");
-            goto error;
-        }
-    }
-
-    // Add audio stream into audio group.
-    if (!group->add(stream)) {
-        jniThrowException(env, "java/lang/IllegalStateException",
-            "cannot add audio stream");
-        goto error;
-    }
-
-    // Succeed.
-    env->SetIntField(thiz, gNative, (int)group);
-    return (int)stream;
-
-error:
-    delete group;
-    delete stream;
-    delete codec;
-    close(socket);
-    env->SetIntField(thiz, gNative, 0);
-    return 0;
-}
-
-void remove(JNIEnv *env, jobject thiz, jint stream)
-{
-    AudioGroup *group = (AudioGroup *)env->GetIntField(thiz, gNative);
-    if (group) {
-        if (!stream || !group->remove((AudioStream *)stream)) {
-            delete group;
-            env->SetIntField(thiz, gNative, 0);
-        }
-    }
-}
-
-void setMode(JNIEnv *env, jobject thiz, jint mode)
-{
-    AudioGroup *group = (AudioGroup *)env->GetIntField(thiz, gNative);
-    if (group && !group->setMode(mode)) {
-        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
-    }
-}
-
-void sendDtmf(JNIEnv *env, jobject thiz, jint event)
-{
-    AudioGroup *group = (AudioGroup *)env->GetIntField(thiz, gNative);
-    if (group && !group->sendDtmf(event)) {
-        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
-    }
-}
-
-JNINativeMethod gMethods[] = {
-    {"nativeAdd", "(IILjava/lang/String;ILjava/lang/String;I)I", (void *)add},
-    {"nativeRemove", "(I)V", (void *)remove},
-    {"nativeSetMode", "(I)V", (void *)setMode},
-    {"nativeSendDtmf", "(I)V", (void *)sendDtmf},
-};
-
-} // namespace
-
-int registerAudioGroup(JNIEnv *env)
-{
-    gRandom = open("/dev/urandom", O_RDONLY);
-    if (gRandom == -1) {
-        ALOGE("urandom: %s", strerror(errno));
-        return -1;
-    }
-
-    jclass clazz;
-    if ((clazz = env->FindClass("android/net/rtp/AudioGroup")) == NULL ||
-        (gNative = env->GetFieldID(clazz, "mNative", "I")) == NULL ||
-        (gMode = env->GetFieldID(clazz, "mMode", "I")) == NULL ||
-        env->RegisterNatives(clazz, gMethods, NELEM(gMethods)) < 0) {
-        ALOGE("JNI registration failed");
-        return -1;
-    }
-    return 0;
-}
diff --git a/voip/jni/rtp/EchoSuppressor.cpp b/voip/jni/rtp/EchoSuppressor.cpp
deleted file mode 100644
index e223136..0000000
--- a/voip/jni/rtp/EchoSuppressor.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdint.h>
-#include <string.h>
-#include <math.h>
-
-#define LOG_TAG "Echo"
-#include <utils/Log.h>
-
-#include "EchoSuppressor.h"
-
-// It is very difficult to do echo cancellation at this level due to the lack of
-// the timing information of the samples being played and recorded. Therefore,
-// for the first release only echo suppression is implemented.
-
-// The algorithm is derived from the "previous works" summarized in
-//   A new class of doubletalk detectors based on cross-correlation,
-//   J Benesty, DR Morgan, JH Cho, IEEE Trans. on Speech and Audio Processing.
-// The method proposed in that paper is not used because of its high complexity.
-
-// It is well known that cross-correlation can be computed using convolution,
-// but unfortunately not every mobile processor has a (fast enough) FPU. Thus
-// we use integer arithmetic as much as possible and do lots of bookkeeping.
-// Again, parameters and thresholds are chosen by experiments.
-
-EchoSuppressor::EchoSuppressor(int sampleCount, int tailLength)
-{
-    tailLength += sampleCount * 4;
-
-    int shift = 0;
-    while ((sampleCount >> shift) > 1 && (tailLength >> shift) > 256) {
-        ++shift;
-    }
-
-    mShift = shift + 4;
-    mScale = 1 << shift;
-    mSampleCount = sampleCount;
-    mWindowSize = sampleCount >> shift;
-    mTailLength = tailLength >> shift;
-    mRecordLength = tailLength * 2 / sampleCount;
-    mRecordOffset = 0;
-
-    mXs = new uint16_t[mTailLength + mWindowSize];
-    memset(mXs, 0, sizeof(*mXs) * (mTailLength + mWindowSize));
-    mXSums = new uint32_t[mTailLength];
-    memset(mXSums, 0, sizeof(*mXSums) * mTailLength);
-    mX2Sums = new uint32_t[mTailLength];
-    memset(mX2Sums, 0, sizeof(*mX2Sums) * mTailLength);
-    mXRecords = new uint16_t[mRecordLength * mWindowSize];
-    memset(mXRecords, 0, sizeof(*mXRecords) * mRecordLength * mWindowSize);
-
-    mYSum = 0;
-    mY2Sum = 0;
-    mYRecords = new uint32_t[mRecordLength];
-    memset(mYRecords, 0, sizeof(*mYRecords) * mRecordLength);
-    mY2Records = new uint32_t[mRecordLength];
-    memset(mY2Records, 0, sizeof(*mY2Records) * mRecordLength);
-
-    mXYSums = new uint32_t[mTailLength];
-    memset(mXYSums, 0, sizeof(*mXYSums) * mTailLength);
-    mXYRecords = new uint32_t[mRecordLength * mTailLength];
-    memset(mXYRecords, 0, sizeof(*mXYRecords) * mRecordLength * mTailLength);
-
-    mLastX = 0;
-    mLastY = 0;
-    mWeight = 1.0f / (mRecordLength * mWindowSize);
-}
-
-EchoSuppressor::~EchoSuppressor()
-{
-    delete [] mXs;
-    delete [] mXSums;
-    delete [] mX2Sums;
-    delete [] mXRecords;
-    delete [] mYRecords;
-    delete [] mY2Records;
-    delete [] mXYSums;
-    delete [] mXYRecords;
-}
-
-void EchoSuppressor::run(int16_t *playbacked, int16_t *recorded)
-{
-    // Update Xs.
-    for (int i = mTailLength - 1; i >= 0; --i) {
-        mXs[i + mWindowSize] = mXs[i];
-    }
-    for (int i = mWindowSize - 1, j = 0; i >= 0; --i, j += mScale) {
-        uint32_t sum = 0;
-        for (int k = 0; k < mScale; ++k) {
-            int32_t x = playbacked[j + k] << 15;
-            mLastX += x;
-            sum += ((mLastX >= 0) ? mLastX : -mLastX) >> 15;
-            mLastX -= (mLastX >> 10) + x;
-        }
-        mXs[i] = sum >> mShift;
-    }
-
-    // Update XSums, X2Sums, and XRecords.
-    for (int i = mTailLength - mWindowSize - 1; i >= 0; --i) {
-        mXSums[i + mWindowSize] = mXSums[i];
-        mX2Sums[i + mWindowSize] = mX2Sums[i];
-    }
-    uint16_t *xRecords = &mXRecords[mRecordOffset * mWindowSize];
-    for (int i = mWindowSize - 1; i >= 0; --i) {
-        uint16_t x = mXs[i];
-        mXSums[i] = mXSums[i + 1] + x - xRecords[i];
-        mX2Sums[i] = mX2Sums[i + 1] + x * x - xRecords[i] * xRecords[i];
-        xRecords[i] = x;
-    }
-
-    // Compute Ys.
-    uint16_t ys[mWindowSize];
-    for (int i = mWindowSize - 1, j = 0; i >= 0; --i, j += mScale) {
-        uint32_t sum = 0;
-        for (int k = 0; k < mScale; ++k) {
-            int32_t y = recorded[j + k] << 15;
-            mLastY += y;
-            sum += ((mLastY >= 0) ? mLastY : -mLastY) >> 15;
-            mLastY -= (mLastY >> 10) + y;
-        }
-        ys[i] = sum >> mShift;
-    }
-
-    // Update YSum, Y2Sum, YRecords, and Y2Records.
-    uint32_t ySum = 0;
-    uint32_t y2Sum = 0;
-    for (int i = mWindowSize - 1; i >= 0; --i) {
-        ySum += ys[i];
-        y2Sum += ys[i] * ys[i];
-    }
-    mYSum += ySum - mYRecords[mRecordOffset];
-    mY2Sum += y2Sum - mY2Records[mRecordOffset];
-    mYRecords[mRecordOffset] = ySum;
-    mY2Records[mRecordOffset] = y2Sum;
-
-    // Update XYSums and XYRecords.
-    uint32_t *xyRecords = &mXYRecords[mRecordOffset * mTailLength];
-    for (int i = mTailLength - 1; i >= 0; --i) {
-        uint32_t xySum = 0;
-        for (int j = mWindowSize - 1; j >= 0; --j) {
-            xySum += mXs[i + j] * ys[j];
-        }
-        mXYSums[i] += xySum - xyRecords[i];
-        xyRecords[i] = xySum;
-    }
-
-    // Compute correlations.
-    int latency = 0;
-    float corr2 = 0.0f;
-    float varX = 0.0f;
-    float varY = mY2Sum - mWeight * mYSum * mYSum;
-    for (int i = mTailLength - 1; i >= 0; --i) {
-        float cov = mXYSums[i] - mWeight * mXSums[i] * mYSum;
-        if (cov > 0.0f) {
-            float varXi = mX2Sums[i] - mWeight * mXSums[i] * mXSums[i];
-            float corr2i = cov * cov / (varXi * varY + 1);
-            if (corr2i > corr2) {
-                varX = varXi;
-                corr2 = corr2i;
-                latency = i;
-            }
-        }
-    }
-    //ALOGI("corr^2 %.5f, var %8.0f %8.0f, latency %d", corr2, varX, varY,
-    //        latency * mScale);
-
-    // Do echo suppression.
-    if (corr2 > 0.1f && varX > 10000.0f) {
-        int factor = (corr2 > 1.0f) ? 0 : (1.0f - sqrtf(corr2)) * 4096;
-        for (int i = 0; i < mSampleCount; ++i) {
-            recorded[i] = recorded[i] * factor >> 16;
-        }
-    }
-
-    // Increase RecordOffset.
-    ++mRecordOffset;
-    if (mRecordOffset == mRecordLength) {
-        mRecordOffset = 0;
-    }
-}
diff --git a/voip/jni/rtp/EchoSuppressor.h b/voip/jni/rtp/EchoSuppressor.h
deleted file mode 100644
index 2f3b593..0000000
--- a/voip/jni/rtp/EchoSuppressor.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#ifndef __ECHO_SUPPRESSOR_H__
-#define __ECHO_SUPPRESSOR_H__
-
-#include <stdint.h>
-
-class EchoSuppressor
-{
-public:
-    // The sampleCount must be power of 2.
-    EchoSuppressor(int sampleCount, int tailLength);
-    ~EchoSuppressor();
-    void run(int16_t *playbacked, int16_t *recorded);
-
-private:
-    int mShift;
-    int mScale;
-    int mSampleCount;
-    int mWindowSize;
-    int mTailLength;
-    int mRecordLength;
-    int mRecordOffset;
-
-    uint16_t *mXs;
-    uint32_t *mXSums;
-    uint32_t *mX2Sums;
-    uint16_t *mXRecords;
-
-    uint32_t mYSum;
-    uint32_t mY2Sum;
-    uint32_t *mYRecords;
-    uint32_t *mY2Records;
-
-    uint32_t *mXYSums;
-    uint32_t *mXYRecords;
-
-    int32_t mLastX;
-    int32_t mLastY;
-
-    float mWeight;
-};
-
-#endif
diff --git a/voip/jni/rtp/G711Codec.cpp b/voip/jni/rtp/G711Codec.cpp
deleted file mode 100644
index ef54863..0000000
--- a/voip/jni/rtp/G711Codec.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#include "AudioCodec.h"
-
-namespace {
-
-const int8_t gExponents[128] = {
-    0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
-    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
-    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-};
-
-//------------------------------------------------------------------------------
-
-class UlawCodec : public AudioCodec
-{
-public:
-    int set(int sampleRate, const char *fmtp) {
-        mSampleCount = sampleRate / 50;
-        return mSampleCount;
-    }
-    int encode(void *payload, int16_t *samples);
-    int decode(int16_t *samples, int count, void *payload, int length);
-private:
-    int mSampleCount;
-};
-
-int UlawCodec::encode(void *payload, int16_t *samples)
-{
-    int8_t *ulaws = (int8_t *)payload;
-    for (int i = 0; i < mSampleCount; ++i) {
-        int sample = samples[i];
-        int sign = (sample >> 8) & 0x80;
-        if (sample < 0) {
-            sample = -sample;
-        }
-        sample += 132;
-        if (sample > 32767) {
-            sample = 32767;
-        }
-        int exponent = gExponents[sample >> 8];
-        int mantissa = (sample >> (exponent + 3)) & 0x0F;
-        ulaws[i] = ~(sign | (exponent << 4) | mantissa);
-    }
-    return mSampleCount;
-}
-
-int UlawCodec::decode(int16_t *samples, int count, void *payload, int length)
-{
-    int8_t *ulaws = (int8_t *)payload;
-    if (length > count) {
-        length = count;
-    }
-    for (int i = 0; i < length; ++i) {
-        int ulaw = ~ulaws[i];
-        int exponent = (ulaw >> 4) & 0x07;
-        int mantissa = ulaw & 0x0F;
-        int sample = (((mantissa << 3) + 132) << exponent) - 132;
-        samples[i] = (ulaw < 0 ? -sample : sample);
-    }
-    return length;
-}
-
-//------------------------------------------------------------------------------
-
-class AlawCodec : public AudioCodec
-{
-public:
-    int set(int sampleRate, const char *fmtp) {
-        mSampleCount = sampleRate / 50;
-        return mSampleCount;
-    }
-    int encode(void *payload, int16_t *samples);
-    int decode(int16_t *samples, int count, void *payload, int length);
-private:
-    int mSampleCount;
-};
-
-int AlawCodec::encode(void *payload, int16_t *samples)
-{
-    int8_t *alaws = (int8_t *)payload;
-    for (int i = 0; i < mSampleCount; ++i) {
-        int sample = samples[i];
-        int sign = (sample >> 8) & 0x80;
-        if (sample < 0) {
-            sample = -sample;
-        }
-        if (sample > 32767) {
-            sample = 32767;
-        }
-        int exponent = gExponents[sample >> 8];
-        int mantissa = (sample >> (exponent == 0 ? 4 : exponent + 3)) & 0x0F;
-        alaws[i] = (sign | (exponent << 4) | mantissa) ^ 0xD5;
-    }
-    return mSampleCount;
-}
-
-int AlawCodec::decode(int16_t *samples, int count, void *payload, int length)
-{
-    int8_t *alaws = (int8_t *)payload;
-    if (length > count) {
-        length = count;
-    }
-    for (int i = 0; i < length; ++i) {
-        int alaw = alaws[i] ^ 0x55;
-        int exponent = (alaw >> 4) & 0x07;
-        int mantissa = alaw & 0x0F;
-        int sample = (exponent == 0 ? (mantissa << 4) + 8 :
-            ((mantissa << 3) + 132) << exponent);
-        samples[i] = (alaw < 0 ? sample : -sample);
-    }
-    return length;
-}
-
-} // namespace
-
-AudioCodec *newUlawCodec()
-{
-    return new UlawCodec;
-}
-
-AudioCodec *newAlawCodec()
-{
-    return new AlawCodec;
-}
diff --git a/voip/jni/rtp/GsmCodec.cpp b/voip/jni/rtp/GsmCodec.cpp
deleted file mode 100644
index 61dfdc9..0000000
--- a/voip/jni/rtp/GsmCodec.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyrightm (C) 2010 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.
- */
-
-#include "AudioCodec.h"
-
-extern "C" {
-#include "gsm.h"
-}
-
-namespace {
-
-class GsmCodec : public AudioCodec
-{
-public:
-    GsmCodec() {
-        mEncode = gsm_create();
-        mDecode = gsm_create();
-    }
-
-    ~GsmCodec() {
-        if (mEncode) {
-            gsm_destroy(mEncode);
-        }
-        if (mDecode) {
-            gsm_destroy(mDecode);
-        }
-    }
-
-    int set(int sampleRate, const char *fmtp) {
-        return (sampleRate == 8000 && mEncode && mDecode) ? 160 : -1;
-    }
-
-    int encode(void *payload, int16_t *samples);
-    int decode(int16_t *samples, int count, void *payload, int length);
-
-private:
-    gsm mEncode;
-    gsm mDecode;
-};
-
-int GsmCodec::encode(void *payload, int16_t *samples)
-{
-    gsm_encode(mEncode, samples, (unsigned char *)payload);
-    return 33;
-}
-
-int GsmCodec::decode(int16_t *samples, int count, void *payload, int length)
-{
-    unsigned char *bytes = (unsigned char *)payload;
-    int n = 0;
-    while (n + 160 <= count && length >= 33 &&
-        gsm_decode(mDecode, bytes, &samples[n]) == 0) {
-        n += 160;
-        length -= 33;
-        bytes += 33;
-    }
-    return n;
-}
-
-} // namespace
-
-AudioCodec *newGsmCodec()
-{
-    return new GsmCodec;
-}
diff --git a/voip/jni/rtp/RtpStream.cpp b/voip/jni/rtp/RtpStream.cpp
deleted file mode 100644
index bfe8e24..0000000
--- a/voip/jni/rtp/RtpStream.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#define LOG_TAG "RtpStream"
-#include <utils/Log.h>
-
-#include "jni.h"
-#include "JNIHelp.h"
-
-extern int parse(JNIEnv *env, jstring jAddress, int port, sockaddr_storage *ss);
-
-namespace {
-
-jfieldID gSocket;
-
-jint create(JNIEnv *env, jobject thiz, jstring jAddress)
-{
-    env->SetIntField(thiz, gSocket, -1);
-
-    sockaddr_storage ss;
-    if (parse(env, jAddress, 0, &ss) < 0) {
-        // Exception already thrown.
-        return -1;
-    }
-
-    int socket = ::socket(ss.ss_family, SOCK_DGRAM, 0);
-    socklen_t len = sizeof(ss);
-    if (socket == -1 || bind(socket, (sockaddr *)&ss, sizeof(ss)) != 0 ||
-        getsockname(socket, (sockaddr *)&ss, &len) != 0) {
-        jniThrowException(env, "java/net/SocketException", strerror(errno));
-        ::close(socket);
-        return -1;
-    }
-
-    uint16_t *p = (ss.ss_family == AF_INET) ?
-        &((sockaddr_in *)&ss)->sin_port : &((sockaddr_in6 *)&ss)->sin6_port;
-    uint16_t port = ntohs(*p);
-    if ((port & 1) == 0) {
-        env->SetIntField(thiz, gSocket, socket);
-        return port;
-    }
-    ::close(socket);
-
-    socket = ::socket(ss.ss_family, SOCK_DGRAM, 0);
-    if (socket != -1) {
-        uint16_t delta = port << 1;
-        ++port;
-
-        for (int i = 0; i < 1000; ++i) {
-            do {
-                port += delta;
-            } while (port < 1024);
-            *p = htons(port);
-
-            if (bind(socket, (sockaddr *)&ss, sizeof(ss)) == 0) {
-                env->SetIntField(thiz, gSocket, socket);
-                return port;
-            }
-        }
-    }
-
-    jniThrowException(env, "java/net/SocketException", strerror(errno));
-    ::close(socket);
-    return -1;
-}
-
-void close(JNIEnv *env, jobject thiz)
-{
-    int socket = env->GetIntField(thiz, gSocket);
-    ::close(socket);
-    env->SetIntField(thiz, gSocket, -1);
-}
-
-JNINativeMethod gMethods[] = {
-    {"create", "(Ljava/lang/String;)I", (void *)create},
-    {"close", "()V", (void *)close},
-};
-
-} // namespace
-
-int registerRtpStream(JNIEnv *env)
-{
-    jclass clazz;
-    if ((clazz = env->FindClass("android/net/rtp/RtpStream")) == NULL ||
-        (gSocket = env->GetFieldID(clazz, "mSocket", "I")) == NULL ||
-        env->RegisterNatives(clazz, gMethods, NELEM(gMethods)) < 0) {
-        ALOGE("JNI registration failed");
-        return -1;
-    }
-    return 0;
-}
diff --git a/voip/jni/rtp/rtp_jni.cpp b/voip/jni/rtp/rtp_jni.cpp
deleted file mode 100644
index 9f4bff9..0000000
--- a/voip/jni/rtp/rtp_jni.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <stdio.h>
-
-#include "jni.h"
-
-extern int registerRtpStream(JNIEnv *env);
-extern int registerAudioGroup(JNIEnv *env);
-
-__attribute__((visibility("default"))) jint JNI_OnLoad(JavaVM *vm, void *unused)
-{
-    JNIEnv *env = NULL;
-    if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK ||
-        registerRtpStream(env) < 0 || registerAudioGroup(env) < 0) {
-        return -1;
-    }
-    return JNI_VERSION_1_4;
-}
diff --git a/voip/jni/rtp/util.cpp b/voip/jni/rtp/util.cpp
deleted file mode 100644
index 1d702fc..0000000
--- a/voip/jni/rtp/util.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2010 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.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#include "jni.h"
-#include "JNIHelp.h"
-
-int parse(JNIEnv *env, jstring jAddress, int port, sockaddr_storage *ss)
-{
-    if (!jAddress) {
-        jniThrowNullPointerException(env, "address");
-        return -1;
-    }
-    if (port < 0 || port > 65535) {
-        jniThrowException(env, "java/lang/IllegalArgumentException", "port");
-        return -1;
-    }
-    const char *address = env->GetStringUTFChars(jAddress, NULL);
-    if (!address) {
-        // Exception already thrown.
-        return -1;
-    }
-    memset(ss, 0, sizeof(*ss));
-
-    sockaddr_in *sin = (sockaddr_in *)ss;
-    if (inet_pton(AF_INET, address, &(sin->sin_addr)) > 0) {
-        sin->sin_family = AF_INET;
-        sin->sin_port = htons(port);
-        env->ReleaseStringUTFChars(jAddress, address);
-        return 0;
-    }
-
-    sockaddr_in6 *sin6 = (sockaddr_in6 *)ss;
-    if (inet_pton(AF_INET6, address, &(sin6->sin6_addr)) > 0) {
-        sin6->sin6_family = AF_INET6;
-        sin6->sin6_port = htons(port);
-        env->ReleaseStringUTFChars(jAddress, address);
-        return 0;
-    }
-
-    env->ReleaseStringUTFChars(jAddress, address);
-    jniThrowException(env, "java/lang/IllegalArgumentException", "address");
-    return -1;
-}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 55de065..0be453c 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -45,7 +45,7 @@
 
     void startScan(boolean forceActive);
 
-    List<ScanResult> getScanResults();
+    List<ScanResult> getScanResults(String callingPackage);
 
     void disconnect();
 
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index ac53eb2..66c2f3f 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -1089,17 +1089,19 @@
                 break setVariables;
             }
 
-            HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields();
-            for (String key : enterpriseFields.keySet()) {
-                    String value = enterpriseFields.get(key);
-                    if (!mWifiNative.setNetworkVariable(
-                                netId,
-                                key,
-                                value)) {
-                        loge(config.SSID + ": failed to set " + key +
-                                ": " + value);
-                        break setVariables;
-                    }
+            if (config.enterpriseConfig != null) {
+                HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields();
+                for (String key : enterpriseFields.keySet()) {
+                        String value = enterpriseFields.get(key);
+                        if (!mWifiNative.setNetworkVariable(
+                                    netId,
+                                    key,
+                                    value)) {
+                            loge(config.SSID + ": failed to set " + key +
+                                    ": " + value);
+                            break setVariables;
+                        }
+                }
             }
             updateFailed = false;
         }
@@ -1398,11 +1400,16 @@
             }
         }
 
-        HashMap<String, String> entepriseFields = config.enterpriseConfig.getFields();
-        for (String key : entepriseFields.keySet()) {
+        if (config.enterpriseConfig == null) {
+            config.enterpriseConfig = new WifiEnterpriseConfig();
+        }
+        HashMap<String, String> enterpriseFields = config.enterpriseConfig.getFields();
+        for (String key : WifiEnterpriseConfig.getSupplicantKeys()) {
             value = mWifiNative.getNetworkVariable(netId, key);
             if (!TextUtils.isEmpty(value)) {
-                entepriseFields.put(key, removeDoubleQuotes(value));
+                enterpriseFields.put(key, removeDoubleQuotes(value));
+            } else {
+                enterpriseFields.put(key, WifiEnterpriseConfig.EMPTY_VALUE);
             }
         }
 
diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
index 46e446e..4dca7ac 100644
--- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
+++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
@@ -74,18 +74,14 @@
     /** This represents an empty value of an enterprise field.
      * NULL is used at wpa_supplicant to indicate an empty value
      */
-    private static final String EMPTY_VALUE = "NULL";
+    static final String EMPTY_VALUE = "NULL";
 
     public WifiEnterpriseConfig() {
-        // Set the required defaults
-        mFields.put(EAP_KEY, Eap.strings[Eap.PEAP]);
-        mFields.put(ENGINE_KEY, ENGINE_DISABLE);
+        // Do not set defaults so that the enterprise fields that are not changed
+        // by API are not changed underneath
+        // This is essential because an app may not have all fields like password
+        // available. It allows modification of subset of fields.
 
-        for (String key : new String[] {PHASE2_KEY, IDENTITY_KEY, ANON_IDENTITY_KEY,
-                PASSWORD_KEY, CLIENT_CERT_KEY, ENGINE_ID_KEY, PRIVATE_KEY_ID_KEY,
-                CA_CERT_KEY, SUBJECT_MATCH_KEY}) {
-            mFields.put(key, EMPTY_VALUE);
-        }
     }
 
     /** Copy constructor */
@@ -128,6 +124,8 @@
             };
 
     public static final class Eap {
+        /* NONE represents an empty enterprise config */
+        public static final int NONE    = -1;
         public static final int PEAP    = 0;
         public static final int TLS     = 1;
         public static final int TTLS    = 2;
@@ -152,6 +150,13 @@
         return mFields;
     }
 
+    /** Internal use only @hide */
+    public static String[] getSupplicantKeys() {
+        return new String[] { EAP_KEY, PHASE2_KEY, IDENTITY_KEY, ANON_IDENTITY_KEY, PASSWORD_KEY,
+                CLIENT_CERT_KEY, CA_CERT_KEY, SUBJECT_MATCH_KEY, ENGINE_KEY, ENGINE_ID_KEY,
+                PRIVATE_KEY_ID_KEY };
+    }
+
     /**
      * Set the EAP authentication method.
      * @param  eapMethod is one {@link Eap#PEAP}, {@link Eap#TLS}, {@link Eap#TTLS} or
@@ -177,7 +182,7 @@
      */
     public int getEapMethod() {
         String eapMethod  = mFields.get(EAP_KEY);
-        return getStringIndex(Eap.strings, eapMethod, Eap.PEAP);
+        return getStringIndex(Eap.strings, eapMethod, Eap.NONE);
     }
 
     /**
@@ -211,7 +216,11 @@
      * @return a phase 2 method defined at {@link Phase2}
      * */
     public int getPhase2Method() {
-        String phase2Method = mFields.get(PHASE2_KEY);
+        String phase2Method = removeDoubleQuotes(mFields.get(PHASE2_KEY));
+        // Remove auth= prefix
+        if (phase2Method.startsWith(Phase2.PREFIX)) {
+            phase2Method = phase2Method.substring(Phase2.PREFIX.length());
+        }
         return getStringIndex(Phase2.strings, phase2Method, Phase2.NONE);
     }
 
@@ -387,9 +396,7 @@
      */
     private int getStringIndex(String arr[], String toBeFound, int defaultIndex) {
         for (int i = 0; i < arr.length; i++) {
-            // toBeFound can be formatted with a prefix. For example, phase2
-            // string has "auth=" as the prefix.
-            if (toBeFound.contains(arr[i])) return i;
+            if (toBeFound.equals(arr[i])) return i;
         }
         return defaultIndex;
     }
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 4861759..c08db07 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -777,7 +777,7 @@
      */
     public List<ScanResult> getScanResults() {
         try {
-            return mService.getScanResults();
+            return mService.getScanResults(mContext.getBasePackageName());
         } catch (RemoteException e) {
             return null;
         }
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 0a61972..9c59f63 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -103,7 +103,6 @@
  */
 public class WifiStateMachine extends StateMachine {
 
-    private static final String TAG = "WifiStateMachine";
     private static final String NETWORKTYPE = "WIFI";
     private static final boolean DBG = false;
 
@@ -565,7 +564,7 @@
     private final IBatteryStats mBatteryStats;
 
     public WifiStateMachine(Context context, String wlanInterface) {
-        super(TAG);
+        super("WifiStateMachine");
 
         mContext = context;
         mInterfaceName = wlanInterface;
@@ -678,7 +677,7 @@
         mScanResultCache = new LruCache<String, ScanResult>(SCAN_RESULT_CACHE_SIZE);
 
         PowerManager powerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
-        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getName());
 
         mSuspendWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WifiSuspend");
         mSuspendWakeLock.setReferenceCounted(false);
@@ -2315,7 +2314,7 @@
             if (!mWifiNative.setSerialNumber(detail)) {
                 loge("Failed to set serial number " + detail);
             }
-            if (!mWifiNative.setConfigMethods("physical_display virtual_push_button keypad")) {
+            if (!mWifiNative.setConfigMethods("physical_display virtual_push_button")) {
                 loge("Failed to set WPS config methods");
             }
             if (!mWifiNative.setDeviceType(mPrimaryDeviceType)) {
@@ -3132,14 +3131,14 @@
                             break;
                         default:
                             result = new WpsResult(Status.FAILURE);
-                            Log.e(TAG, "Invalid setup for WPS");
+                            loge("Invalid setup for WPS");
                             break;
                     }
                     if (result.status == Status.SUCCESS) {
                         replyToMessage(message, WifiManager.START_WPS_SUCCEEDED, result);
                         transitionTo(mWpsRunningState);
                     } else {
-                        Log.e(TAG, "Failed to start WPS with config " + wpsInfo.toString());
+                        loge("Failed to start WPS with config " + wpsInfo.toString());
                         replyToMessage(message, WifiManager.WPS_FAILED, WifiManager.ERROR);
                     }
                     break;
@@ -3465,7 +3464,7 @@
         public void exit() {
             /* Request a CS wakelock during transition to mobile */
             checkAndSetConnectivityInstance();
-            mCm.requestNetworkTransitionWakelock(TAG);
+            mCm.requestNetworkTransitionWakelock(getName());
         }
     }
 
@@ -4040,12 +4039,4 @@
         msg.arg2 = srcMsg.arg2;
         return msg;
     }
-
-    private void log(String s) {
-        Log.d(TAG, s);
-    }
-
-    private void loge(String s) {
-        Log.e(TAG, s);
-    }
 }
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index 423558f..53e6b51 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -77,7 +77,6 @@
 
     /* STOPSHIP: Keep this configurable for debugging until ship */
     private static boolean DBG = false;
-    private static final String TAG = "WifiWatchdogStateMachine";
 
     private static final int BASE = Protocol.BASE_WIFI_WATCHDOG;
 
@@ -306,7 +305,7 @@
      *                       (all other states)
      */
     private WifiWatchdogStateMachine(Context context) {
-        super(TAG);
+        super("WifiWatchdogStateMachine");
         mContext = context;
         mContentResolver = context.getContentResolver();
         mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@@ -968,14 +967,6 @@
         return Settings.Global.putInt(cr, name, value ? 1 : 0);
     }
 
-    private static void logd(String s) {
-        Log.d(TAG, s);
-    }
-
-    private static void loge(String s) {
-        Log.e(TAG, s);
-    }
-
     /**
      * Bundle of good link count parameters
      */
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index debf988..77604a4 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -2460,11 +2460,13 @@
         return msg;
     }
 
-    private void logd(String s) {
+    @Override
+    protected void logd(String s) {
         Slog.d(TAG, s);
     }
 
-    private void loge(String s) {
+    @Override
+    protected void loge(String s) {
         Slog.e(TAG, s);
     }
 
