Home | History | Annotate | Download | only in security
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.car.settings.security;
     18 
     19 import android.annotation.DrawableRes;
     20 import android.annotation.Nullable;
     21 import android.content.Context;
     22 import android.support.annotation.VisibleForTesting;
     23 import android.util.AttributeSet;
     24 import android.view.LayoutInflater;
     25 import android.view.View;
     26 import android.widget.GridLayout;
     27 import android.widget.ImageButton;
     28 import android.widget.TextView;
     29 
     30 import com.android.car.settings.R;
     31 
     32 import java.util.ArrayList;
     33 import java.util.List;
     34 
     35 /**
     36  * A custom view for the PIN pad.
     37  */
     38 public class PinPadView extends GridLayout {
     39     // Number of keys in the pin pad, 0-9 plus backspace and enter keys.
     40     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     41     static final int NUM_KEYS = 12;
     42 
     43     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     44     static final int[] PIN_PAD_DIGIT_KEYS = { R.id.key0, R.id.key1, R.id.key2, R.id.key3,
     45             R.id.key4, R.id.key5, R.id.key6, R.id.key7, R.id.key8, R.id.key9 };
     46 
     47     private final List<View> mPinKeys = new ArrayList<>(NUM_KEYS);
     48     private PinPadClickListener mOnClickListener;
     49     private ImageButton mEnterKey;
     50 
     51     public PinPadView(Context context) {
     52         super(context);
     53         init();
     54     }
     55 
     56     public PinPadView(Context context, AttributeSet attrs) {
     57         super(context, attrs);
     58         init();
     59     }
     60 
     61     public PinPadView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
     62         super(context, attrs, defStyleAttr);
     63         init();
     64     }
     65 
     66     public PinPadView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
     67             int defStyleRes) {
     68         super(context, attrs, defStyleAttr, defStyleRes);
     69         init();
     70     }
     71 
     72     /**
     73      * Set the call back for key click.
     74      *
     75      * @param pinPadClickListener The call back.
     76      */
     77     public void setPinPadClickListener(PinPadClickListener pinPadClickListener) {
     78         mOnClickListener = pinPadClickListener;
     79     }
     80 
     81     @Override
     82     public void setEnabled(boolean enabled) {
     83         super.setEnabled(enabled);
     84         for (View key: mPinKeys) {
     85             key.setEnabled(enabled);
     86         }
     87     }
     88 
     89     /**
     90      * Set the resource Id of the enter key icon.
     91      *
     92      * @param drawableId  The resource Id of the drawable.
     93      */
     94     public void setEnterKeyIcon(@DrawableRes int drawableId) {
     95         mEnterKey.setImageResource(drawableId);
     96     }
     97 
     98     private void init() {
     99         LayoutInflater inflater = LayoutInflater.from(getContext());
    100         inflater.inflate(R.layout.pin_pad_view, this, true);
    101 
    102         for (int keyId : PIN_PAD_DIGIT_KEYS) {
    103             TextView key = (TextView) findViewById(keyId);
    104             String digit = key.getTag().toString();
    105             key.setOnClickListener(v -> {
    106                 mOnClickListener.onDigitKeyClick(digit);
    107             });
    108             mPinKeys.add(key);
    109         }
    110 
    111         View backspace = findViewById(R.id.key_backspace);
    112         backspace.setOnClickListener(v -> mOnClickListener.onBackspaceClick());
    113         mPinKeys.add(backspace);
    114 
    115         mEnterKey = (ImageButton) findViewById(R.id.key_enter);
    116         mEnterKey.setOnClickListener(v -> mOnClickListener.onEnterKeyClick());
    117         mPinKeys.add(mEnterKey);
    118     }
    119 
    120     /**
    121      * The call back interface for onClick event in the view.
    122      */
    123     public interface PinPadClickListener {
    124         /**
    125          * One of the digit key has been clicked.
    126          *
    127          * @param digit A String representing a digit between 0 and 9.
    128          */
    129         void onDigitKeyClick(String digit);
    130 
    131         /**
    132          * The backspace key has been clicked.
    133          */
    134         void onBackspaceClick();
    135 
    136         /**
    137          * The enter key has been clicked.
    138          */
    139         void onEnterKeyClick();
    140     }
    141 }
    142