// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.ntp;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.ScrollView;
/**
* Simple wrapper on top of a ScrollView that will acquire focus when tapped. Ensures the
* New Tab page receives focus when clicked. This is only used in the Incognito NTP.
*/
public class NewTabPageScrollView extends ScrollView {
private GestureDetector mGestureDetector;
/** Constructor needed to inflate from XML. */
public NewTabPageScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector =
new GestureDetector(
getContext(),
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
boolean retVal = super.onSingleTapUp(e);
requestFocus();
return retVal;
}
});
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
}
@Override
@SuppressLint("ClickableViewAccessibility")
public boolean onTouchEvent(MotionEvent ev) {
// Action down would already have been handled in onInterceptTouchEvent
if (ev.getActionMasked() != MotionEvent.ACTION_DOWN) {
mGestureDetector.onTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
@Override
public void focusableViewAvailable(View v) {
// To avoid odd jumps during NTP animation transitions, we do not attempt to give focus
// to child views if this scroll view already has focus.
if (hasFocus()) return;
super.focusableViewAvailable(v);
}
@Override
public boolean executeKeyEvent(KeyEvent event) {
// Ignore all key events except arrow keys and spacebar. Otherwise, the ScrollView consumes
// unwanted events (including the hardware menu button and app-level keyboard shortcuts).
// http://crbug.com/308322
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_SPACE:
return super.executeKeyEvent(event);
default:
return false;
}
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
// Fixes lanscape transitions when unfocusing the URL bar: crbug.com/288546
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN;
return super.onCreateInputConnection(outAttrs);
}
}