Wednesday, December 14, 2011

Клавиатура для ввода паролей


Очень часто я в качестве основы для паролей использую русские слова в английской раскладке. Например, слово “Привет” при этом превращается в “Ghbdtn”. Но клавиатуры на смартфонах, в отличие от ноубуков,  не имеют дублированных букв на клавишах, что иногда затрудняет ввод пароля. Идею такой клавиатуры я впервые встретила у одного талантливого программиста – Димы Корнилова: http://dimakornilov.ru/blog/?p=1231

За основу была взята SoftKeyboard из примеров Android SDK. Мне хотелось иметь полноценную символьную раскладку, так как иногда использую специфичные символы в паролях, и стандартное поведение клавиши Shift – обычный Shift при одинарном нажатии и поведение Caps Lock при двойном нажатии.

Некоторые детали реализации:

1.    Отображение английских букв на русские клавиши:
В xml/qwerty.xml раскладке русским буквам на клавишах должны соответствовать коды клавиш из английской раскладки:

        <Key android:codes="113" android:keyLabel="й" android:keyEdgeFlags="left"/>
        <Key android:codes="119" android:keyLabel="ц"/>
        <Key android:codes="101" android:keyLabel="у"/>
        <Key android:codes="114" android:keyLabel="к"/>
        <Key android:codes="116" android:keyLabel="е"/>
        <Key android:codes="121" android:keyLabel="н"/>
 
Здесь "113" – символ “q” в Unicode кодировке, "119" – символ “w”

2.    Использование собственного фона для клавиш, чтобы внешне отличать клавиатуру, например от стандарной Android клавиатуры.
Для этого в layout/input.xml у KeyboardView просто указать нужные ресурсы:

android:background="@drawable/keyboard_background
android:keyBackground="@drawable/btn_keyboard_key"
 
3.    Реализация стандартного поведения клавиши Shift

В Java – коде для этого добавлены три состояния клавиши – On, Off и Locked.
Класс android.inputmethodservice.Keyboard.Key содержит поля label и on, которые можно менять в зависимости от состояния клавиши. 
 Доступ к самой Shift клавиши можно получить с помощью следующего кода:
mShiftKey = mQwertyKeyboard.getKeys().get(
                mQwertyKeyboard.getShiftKeyIndex());
Учитывая, что у клавиш должен меняться фон при нажатии, можно использовать следующий selector для этого:
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Toggle keys. Use checkable/checked state. -->

    <item android:state_checkable="true" android:state_checked="true"
          android:state_pressed="true"
          android:drawable="@drawable/key_toggle_pressed_on" />
    <item android:state_checkable="true" android:state_pressed="true"
          android:drawable="@drawable/key_toggle_pressed_off" />
    <item android:state_checkable="true" android:state_checked="true"
          android:drawable="@drawable/key_toggle_normal_on" />
    <item android:state_checkable="true"
          android:drawable="@drawable/key_toggle_normal_off" />

    <!-- Normal keys -->
    <item android:state_pressed="true"
          android:drawable="@drawable/key_background_pressed" />
    <item android:drawable="@drawable/key_background_normal" />

</selector>
В результате получим вот такую клавиатуру:
  












После установки приложения надо включить клавиатуру в настройках:















Теперь она доступна из контекстного меню любого текстового поля (долгое нажатие на текстовом поле):
 










Исходный код можно посмотреть на http://code.google.com/p/passwordkeyboard/



2 comments:

  1. Good implementation!

    I accidentally found your blog post after deploying Google Analytics on my site.

    ReplyDelete
  2. А нету на маркете этого приложения, а так хотелось...

    ReplyDelete