Merge "The back key stops selection mode in extracted text mode."
diff --git a/core/java/android/inputmethodservice/ExtractEditLayout.java b/core/java/android/inputmethodservice/ExtractEditLayout.java
index 5cfa998..25c0c99 100644
--- a/core/java/android/inputmethodservice/ExtractEditLayout.java
+++ b/core/java/android/inputmethodservice/ExtractEditLayout.java
@@ -16,9 +16,6 @@
 
 package android.inputmethodservice;
 
-import com.android.internal.view.menu.MenuBuilder;
-import com.android.internal.view.menu.MenuPopupHelper;
-
 import android.content.Context;
 import android.util.AttributeSet;
 import android.view.ActionMode;
@@ -29,6 +26,9 @@
 import android.widget.Button;
 import android.widget.LinearLayout;
 
+import com.android.internal.view.menu.MenuBuilder;
+import com.android.internal.view.menu.MenuPopupHelper;
+
 /**
  * ExtractEditLayout provides an ActionMode presentation for the
  * limited screen real estate in extract mode.
@@ -61,6 +61,22 @@
         return null;
     }
 
+    /**
+     * @return true if an action mode is currently active.
+     */
+    public boolean isActionModeStarted() {
+        return mActionMode != null;
+    }
+
+    /**
+     * Finishes a possibly started action mode.
+     */
+    public void finishActionMode() {
+        if (mActionMode != null) {
+            mActionMode.finish();
+        }
+    }
+
     @Override
     public void onFinishInflate() {
         super.onFinishInflate();
@@ -92,7 +108,7 @@
 
         @Override
         public void setTitle(int resId) {
-            // Title will nor be shown.
+            // Title will not be shown.
         }
 
         @Override
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 7d3cd92..440d649 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -637,6 +637,7 @@
      * configuration change happens.
      */
     public void onInitializeInterface() {
+        // Intentionally empty
     }
 
     void initialize() {
@@ -876,8 +877,7 @@
         }
         
         if (changed) {
-            onConfigureWindow(mWindow.getWindow(), isFullscreen,
-                    !mShowInputRequested);
+            onConfigureWindow(mWindow.getWindow(), isFullscreen, !mShowInputRequested);
             mLastShowInputRequested = mShowInputRequested;
         }
     }
@@ -935,7 +935,7 @@
         }
         return true;
     }
-    
+
     /**
      * Controls the visibility of the extracted text area.  This only applies
      * when the input method is in fullscreen mode, and thus showing extracted
@@ -1242,6 +1242,7 @@
      * same text field as before.
      */
     public void onStartInputView(EditorInfo info, boolean restarting) {
+        // Intentionally empty
     }
     
     /**
@@ -1286,6 +1287,7 @@
      * same text field as before.
      */
     public void onStartCandidatesView(EditorInfo info, boolean restarting) {
+        // Intentionally empty
     }
     
     /**
@@ -1455,6 +1457,7 @@
      * for the window has occurred (creating its views etc).
      */
     public void onWindowShown() {
+        // Intentionally empty
     }
     
     /**
@@ -1462,6 +1465,7 @@
      * after previously being visible.
      */
     public void onWindowHidden() {
+        // Intentionally empty
     }
     
     /**
@@ -1472,6 +1476,7 @@
      * and {@link #getCurrentInputConnection} return valid objects.
      */
     public void onBindInput() {
+        // Intentionally empty
     }
     
     /**
@@ -1481,6 +1486,7 @@
      * valid objects.
      */
     public void onUnbindInput() {
+        // Intentionally empty
     }
     
     /**
@@ -1496,6 +1502,7 @@
      * session with the editor.
      */
     public void onStartInput(EditorInfo attribute, boolean restarting) {
+        // Intentionally empty
     }
     
     void doFinishInput() {
@@ -1570,6 +1577,7 @@
      * <p>The default implementation here does nothing.
      */
     public void onDisplayCompletions(CompletionInfo[] completions) {
+        // Intentionally empty
     }
     
     /**
@@ -1626,6 +1634,7 @@
      * @param focusChanged true if the user changed the focused view by this click.
      */
     public void onViewClicked(boolean focusChanged) {
+        // Intentionally empty
     }
 
     /**
@@ -1634,6 +1643,7 @@
      * The default implementation does nothing.
      */
     public void onUpdateCursor(Rect newCursor) {
+        // Intentionally empty
     }
 
     /**
@@ -1664,6 +1674,13 @@
     
     private boolean handleBack(boolean doIt) {
         if (mShowInputRequested) {
+            if (isExtractViewShown() && mExtractView instanceof ExtractEditLayout) {
+                ExtractEditLayout extractEditLayout = (ExtractEditLayout) mExtractView;
+                if (extractEditLayout.isActionModeStarted()) {
+                    if (doIt) extractEditLayout.finishActionMode();
+                    return true;
+                }
+            }
             // If the soft input area is shown, back closes it and we
             // consume the back key.
             if (doIt) requestHideSelf(0);