Index: ui/android/java/src/org/chromium/ui/UiUtils.java |
diff --git a/ui/android/java/src/org/chromium/ui/UiUtils.java b/ui/android/java/src/org/chromium/ui/UiUtils.java |
index e46e6fec402dba7bacb9adeded4f4d0543a08639..10f33162d47aa04b78f5b8ff402f35dd3098f090 100644 |
--- a/ui/android/java/src/org/chromium/ui/UiUtils.java |
+++ b/ui/android/java/src/org/chromium/ui/UiUtils.java |
@@ -8,12 +8,15 @@ import android.content.Context; |
import android.graphics.Bitmap; |
import android.graphics.Canvas; |
import android.graphics.Rect; |
+import android.os.Handler; |
import android.util.Log; |
import android.view.SurfaceView; |
import android.view.View; |
import android.view.ViewGroup; |
import android.view.inputmethod.InputMethodManager; |
+import java.util.concurrent.atomic.AtomicInteger; |
+ |
/** |
* Utility functions for common Android UI tasks. |
* This class is not supposed to be instantiated. |
@@ -21,6 +24,9 @@ import android.view.inputmethod.InputMethodManager; |
public class UiUtils { |
private static final String TAG = "UiUtils"; |
+ private static final int KEYBOARD_RETRY_ATTEMPTS = 10; |
+ private static final long KEYBOARD_RETRY_DELAY_MS = 100; |
+ |
/** |
* Guards this class from being instantiated. |
*/ |
@@ -59,12 +65,29 @@ public class UiUtils { |
* Shows the software keyboard if necessary. |
* @param view The currently focused {@link View}, which would receive soft keyboard input. |
*/ |
- public static void showKeyboard(View view) { |
- InputMethodManager imm = |
- (InputMethodManager) view.getContext().getSystemService( |
- Context.INPUT_METHOD_SERVICE); |
- // Only shows soft keyboard if there isn't an open physical keyboard. |
- imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); |
+ public static void showKeyboard(final View view) { |
+ final Handler handler = new Handler(); |
+ final AtomicInteger attempt = new AtomicInteger(); |
+ Runnable openRunnable = new Runnable() { |
+ @Override |
+ public void run() { |
+ // Not passing InputMethodManager.SHOW_IMPLICIT as it does not trigger the |
+ // keyboard in landscape mode. |
+ InputMethodManager imm = |
+ (InputMethodManager) view.getContext().getSystemService( |
+ Context.INPUT_METHOD_SERVICE); |
+ try { |
+ imm.showSoftInput(view, 0); |
+ } catch (IllegalArgumentException e) { |
+ if (attempt.incrementAndGet() <= KEYBOARD_RETRY_ATTEMPTS) { |
+ handler.postDelayed(this, KEYBOARD_RETRY_DELAY_MS); |
+ } else { |
+ Log.e(TAG, "Unable to open keyboard. Giving up.", e); |
+ } |
+ } |
+ } |
+ }; |
+ openRunnable.run(); |
} |
/** |