fix shortcut handling

    Bugs: 3400078
    	  3270434
	  3368141
	  3381411

    Fixed controller to check for menu & ctrl keys for shortcuts
    Changed focus handling in url bar
    Keyboard focus transitions are not 100% working yet, but it's possible
    to navigate to all the elements

Change-Id: I514d85a37dae2589e3ce1ecb18c7fc0bf4e715f3
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 1f15b32..2ec2111 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -29,7 +29,6 @@
 import android.util.Patterns;
 import android.view.KeyEvent;
 import android.view.View;
-import android.view.View.OnFocusChangeListener;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
@@ -44,7 +43,7 @@
  * handling suggestions
  */
 public class UrlInputView extends AutoCompleteTextView
-        implements OnFocusChangeListener, OnEditorActionListener,
+        implements OnEditorActionListener,
         CompletionListener, OnItemClickListener {
 
 
@@ -55,12 +54,11 @@
     private UrlInputListener   mListener;
     private InputMethodManager mInputManager;
     private SuggestionsAdapter mAdapter;
-    private OnFocusChangeListener mWrappedFocusListener;
     private View mContainer;
     private boolean mLandscape;
-    private boolean mInVoiceMode;
     private boolean mIncognitoMode;
     private int mVOffset;
+    private boolean mNeedsUpdate;
 
     public UrlInputView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
@@ -80,7 +78,6 @@
     private void init(Context ctx) {
         mInputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
         setOnEditorActionListener(this);
-        super.setOnFocusChangeListener(this);
         mAdapter = new SuggestionsAdapter(ctx, this);
         setAdapter(mAdapter);
         setSelectAllOnFocus(true);
@@ -88,6 +85,21 @@
         setThreshold(1);
         setOnItemClickListener(this);
         mVOffset = 0;
+        mNeedsUpdate = false;
+    }
+
+    /**
+     * check if focus change requires a title bar update
+     */
+    boolean needsUpdate() {
+        return mNeedsUpdate;
+    }
+
+    /**
+     * clear the focus change needs title bar update flag
+     */
+    void clearNeedsUpdate() {
+        mNeedsUpdate = false;
     }
 
     void setController(UiController controller) {
@@ -107,9 +119,12 @@
         mContainer = container;
     }
 
+    public void setUrlInputListener(UrlInputListener listener) {
+        mListener = listener;
+    }
+
     void setVoiceResults(List<String> voiceResults) {
         mAdapter.setVoiceResults(voiceResults);
-        mInVoiceMode = (voiceResults != null);
     }
 
     @Override
@@ -148,43 +163,28 @@
     }
 
     @Override
-    public void setOnFocusChangeListener(OnFocusChangeListener focusListener) {
-        mWrappedFocusListener = focusListener;
-    }
-
-    @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         finishInput(getText().toString(), null, TYPED);
         return true;
     }
 
-    @Override
-    public void onFocusChange(View v, boolean hasFocus) {
-        if (mWrappedFocusListener != null) {
-            mWrappedFocusListener.onFocusChange(v, hasFocus);
-        }
-        if (hasFocus) {
-            forceIme();
-            if (mInVoiceMode) {
-                performFiltering(getText().toString(), 0);
-                showDropDown();
-            }
-        } else {
-            finishInput(null, null, null);
-        }
+    void forceFilter() {
+        performFiltering(getText().toString(), 0);
+        showDropDown();
     }
 
-    public void setUrlInputListener(UrlInputListener listener) {
-        mListener = listener;
-    }
-
-    public void forceIme() {
+    void forceIme() {
         mInputManager.focusIn(this);
         mInputManager.showSoftInput(this, 0);
     }
 
+    void hideIME() {
+        mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
+    }
+
     private void finishInput(String url, String extra, String source) {
-        this.dismissDropDown();
+        mNeedsUpdate = true;
+        dismissDropDown();
         mInputManager.hideSoftInputFromWindow(getWindowToken(), 0);
         if (TextUtils.isEmpty(url)) {
             mListener.onDismiss();
@@ -230,17 +230,6 @@
     }
 
     @Override
-    public boolean onKeyPreIme(int keyCode, KeyEvent evt) {
-        if ((evt.getAction() == KeyEvent.ACTION_DOWN)
-                && (keyCode == KeyEvent.KEYCODE_BACK)) {
-            // catch back key in order to do slightly more cleanup than usual
-            clearFocus();
-            return true;
-        }
-        return super.onKeyPreIme(keyCode, evt);
-    }
-
-    @Override
     public void onItemClick(
             AdapterView<?> parent, View view, int position, long id) {
         SuggestItem item = mAdapter.getItem(position);
@@ -263,4 +252,13 @@
         mAdapter.setIncognitoMode(mIncognitoMode);
     }
 
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent evt) {
+        if (keyCode == KeyEvent.KEYCODE_ESCAPE && !isInTouchMode()) {
+            finishInput(null, null, null);
+            return true;
+        }
+        return super.onKeyDown(keyCode, evt);
+    }
+
 }