diff options
4 files changed, 50 insertions, 0 deletions
diff --git a/core/res/res/layout/keyguard_pin_view.xml b/core/res/res/layout/keyguard_pin_view.xml index d62570b4a857..c2c9c37c663d 100644 --- a/core/res/res/layout/keyguard_pin_view.xml +++ b/core/res/res/layout/keyguard_pin_view.xml @@ -59,6 +59,7 @@ android:paddingLeft="24dp" android:paddingRight="24dp" android:background="?android:attr/selectableItemBackground" + android:contentDescription="@string/keyboardview_keycode_delete" /> </LinearLayout> <View @@ -196,6 +197,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:src="@drawable/sym_keyboard_return_holo" + android:contentDescription="@string/keyboardview_keycode_enter" /> </LinearLayout> diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java index 9c21830cf710..973e6400be53 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardAbsKeyInputView.java @@ -97,6 +97,9 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mPasswordEntry.setOnEditorActionListener(this); mPasswordEntry.addTextChangedListener(this); + // Set selected property on so the view can send accessibility events. + mPasswordEntry.setSelected(true); + // Poke the wakelock any time the text is selected or modified mPasswordEntry.setOnClickListener(new OnClickListener() { public void onClick(View v) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java index bea9aec13ed5..c2d591676e49 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardPINView.java @@ -59,6 +59,7 @@ public class KeyguardPINView extends KeyguardAbsKeyInputView verifyPasswordAndUnlock(); } }); + ok.setOnHoverListener(new NumPadKey.LiftToActivateListener(getContext())); } // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts, diff --git a/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java b/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java index 060cc03e0f92..ca36007a2ef5 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/NumPadKey.java @@ -22,7 +22,9 @@ import android.text.SpannableStringBuilder; import android.text.style.TextAppearanceSpan; import android.util.AttributeSet; import android.view.HapticFeedbackConstants; +import android.view.MotionEvent; import android.view.View; +import android.view.accessibility.AccessibilityManager; import android.widget.Button; import android.widget.TextView; @@ -72,6 +74,7 @@ public class NumPadKey extends Button { setTextViewResId(a.getResourceId(R.styleable.NumPadKey_textView, 0)); setOnClickListener(mListener); + setOnHoverListener(new LiftToActivateListener(context)); mEnableHaptics = new LockPatternUtils(context).isTactileFeedbackEnabled(); @@ -113,4 +116,45 @@ public class NumPadKey extends Button { | HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); } } + + /** + * Hover listener that implements lift-to-activate interaction for + * accessibility. May be added to multiple views. + */ + static class LiftToActivateListener implements View.OnHoverListener { + /** Manager used to query accessibility enabled state. */ + private final AccessibilityManager mAccessibilityManager; + + public LiftToActivateListener(Context context) { + mAccessibilityManager = (AccessibilityManager) context.getSystemService( + Context.ACCESSIBILITY_SERVICE); + } + + @Override + public boolean onHover(View v, MotionEvent event) { + // When touch exploration is turned on, lifting a finger while + // inside the view bounds should perform a click action. + if (mAccessibilityManager.isEnabled() + && mAccessibilityManager.isTouchExplorationEnabled()) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_HOVER_ENTER: + // Lift-to-type temporarily disables double-tap + // activation. + v.setClickable(false); + break; + case MotionEvent.ACTION_HOVER_EXIT: + final int x = (int) event.getX(); + final int y = (int) event.getY(); + if ((x > v.getPaddingLeft()) && (y > v.getPaddingTop()) + && (x < v.getWidth() - v.getPaddingRight()) + && (y < v.getHeight() - v.getPaddingBottom())) { + v.performClick(); + } + v.setClickable(true); + break; + } + } + return false; + } + } } |