Merge "Preserve invocation order in RemoteInputConnection"
diff --git a/core/java/android/inputmethodservice/RemoteInputConnection.java b/core/java/android/inputmethodservice/RemoteInputConnection.java
index 657f842..ae97fe7 100644
--- a/core/java/android/inputmethodservice/RemoteInputConnection.java
+++ b/core/java/android/inputmethodservice/RemoteInputConnection.java
@@ -108,7 +108,11 @@
     @Nullable
     @AnyThread
     public CharSequence getTextAfterCursor(@IntRange(from = 0) int length, int flags) {
-        if (length < 0 || mCancellationGroup.isCanceled()) {
+        if (length < 0) {
+            // TODO: Should we throw an InvalidParameterException() based on targetSdkVersion?
+            Log.e(TAG, "length=" + length + " is invalid and always results in null result.");
+        }
+        if (mCancellationGroup.isCanceled()) {
             return null;
         }
 
@@ -132,7 +136,11 @@
     @Nullable
     @AnyThread
     public CharSequence getTextBeforeCursor(@IntRange(from = 0) int length, int flags) {
-        if (length < 0 || mCancellationGroup.isCanceled()) {
+        if (length < 0) {
+            // TODO: Should we throw an InvalidParameterException() based on targetSdkVersion?
+            Log.e(TAG, "length=" + length + " is invalid and always results in null result.");
+        }
+        if (mCancellationGroup.isCanceled()) {
             return null;
         }
 
@@ -185,7 +193,17 @@
     @AnyThread
     public SurroundingText getSurroundingText(
             @IntRange(from = 0) int beforeLength, @IntRange(from = 0) int afterLength, int flags) {
-        if (beforeLength < 0 || afterLength < 0 || mCancellationGroup.isCanceled()) {
+        if (beforeLength < 0) {
+            // TODO: Should we throw an InvalidParameterException() based on targetSdkVersion?
+            Log.e(TAG, "beforeLength=" + beforeLength
+                    + " is invalid and always results in null result.");
+        }
+        if (afterLength < 0) {
+            // TODO: Should we throw an InvalidParameterException() based on targetSdkVersion?
+            Log.e(TAG, "afterLength=" + afterLength
+                    + " is invalid and always results in null result.");
+        }
+        if (mCancellationGroup.isCanceled()) {
             return null;
         }
 
diff --git a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
index 29c1b1b..7a668fb 100644
--- a/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
+++ b/core/java/com/android/internal/inputmethod/RemoteInputConnectionImpl.java
@@ -233,6 +233,11 @@
                 Log.w(TAG, "getTextAfterCursor on inactive InputConnection");
                 return null;
             }
+            if (length < 0) {
+                Log.i(TAG, "Returning null to getTextAfterCursor due to an invalid length="
+                        + length);
+                return null;
+            }
             return ic.getTextAfterCursor(length, flags);
         }, useImeTracing() ? result -> buildGetTextAfterCursorProto(length, flags, result) : null);
     }
@@ -246,6 +251,11 @@
                 Log.w(TAG, "getTextBeforeCursor on inactive InputConnection");
                 return null;
             }
+            if (length < 0) {
+                Log.i(TAG, "Returning null to getTextBeforeCursor due to an invalid length="
+                        + length);
+                return null;
+            }
             return ic.getTextBeforeCursor(length, flags);
         }, useImeTracing() ? result -> buildGetTextBeforeCursorProto(length, flags, result) : null);
     }
@@ -276,6 +286,16 @@
                 Log.w(TAG, "getSurroundingText on inactive InputConnection");
                 return null;
             }
+            if (beforeLength < 0) {
+                Log.i(TAG, "Returning null to getSurroundingText due to an invalid"
+                        + " beforeLength=" + beforeLength);
+                return null;
+            }
+            if (afterLength < 0) {
+                Log.i(TAG, "Returning null to getSurroundingText due to an invalid"
+                        + " afterLength=" + afterLength);
+                return null;
+            }
             return ic.getSurroundingText(beforeLength, afterLength, flags);
         }, useImeTracing() ? result -> buildGetSurroundingTextProto(
                 beforeLength, afterLength, flags, result) : null);