1 /* 2 * Copyright (C) 2017 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 package com.example.android.autofill.app; 17 18 import android.content.Context; 19 import android.content.Intent; 20 import android.os.Bundle; 21 import android.support.v7.app.AppCompatActivity; 22 import android.view.View; 23 import android.view.autofill.AutofillManager; 24 import android.widget.ArrayAdapter; 25 import android.widget.EditText; 26 import android.widget.Spinner; 27 28 import java.util.Calendar; 29 30 public class CreditCardSpinnersActivity extends AppCompatActivity { 31 32 private static final int CC_EXP_YEARS_COUNT = 5; 33 34 private final String[] years = new String[CC_EXP_YEARS_COUNT]; 35 36 private Spinner mCcExpirationDaySpinner; 37 private Spinner mCcExpirationMonthSpinner; 38 private Spinner mCcExpirationYearSpinner; 39 private EditText mCcCardNumber; 40 private EditText mCcSecurityCode; 41 42 public static Intent getStartActivityIntent(Context context) { 43 Intent intent = new Intent(context, CreditCardSpinnersActivity.class); 44 return intent; 45 } 46 47 @Override 48 protected void onCreate(Bundle savedInstanceState) { 49 super.onCreate(savedInstanceState); 50 setContentView(R.layout.credit_card_spinners_activity); 51 mCcExpirationDaySpinner = findViewById(R.id.expirationDay); 52 mCcExpirationMonthSpinner = findViewById(R.id.expirationMonth); 53 mCcExpirationYearSpinner = findViewById(R.id.expirationYear); 54 mCcCardNumber = findViewById(R.id.creditCardNumberField); 55 mCcSecurityCode = findViewById(R.id.creditCardSecurityCode); 56 57 // Create an ArrayAdapter using the string array and a default spinner layout 58 ArrayAdapter<CharSequence> dayAdapter = ArrayAdapter.createFromResource 59 (this, R.array.day_array, android.R.layout.simple_spinner_item); 60 // Specify the layout to use when the list of choices appears 61 dayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 62 // Apply the adapter to the spinner 63 mCcExpirationDaySpinner.setAdapter(dayAdapter); 64 65 /* 66 R.array.month_array could be an array of Strings like "Jan", "Feb", "March", etc., and 67 the AutofillService would know how to autofill it. However, for the sake of keeping the 68 AutofillService simple, we will stick to a list of numbers (1, 2, ... 12) to represent 69 months; it makes it much easier to generate fake autofill data in the service that can still 70 autofill this spinner. 71 */ 72 ArrayAdapter<CharSequence> monthAdapter = ArrayAdapter.createFromResource( 73 this, R.array.month_array, android.R.layout.simple_spinner_item); 74 // Adapter created from resource has getAutofillOptions() implemented by default. 75 monthAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 76 mCcExpirationMonthSpinner.setAdapter(monthAdapter); 77 78 int year = Calendar.getInstance().get(Calendar.YEAR); 79 for (int i = 0; i < years.length; i++) { 80 years[i] = Integer.toString(year + i); 81 } 82 // Since the years Spinner uses a custom adapter, it needs to implement getAutofillOptions. 83 mCcExpirationYearSpinner.setAdapter( 84 new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, years) { 85 @Override 86 public CharSequence[] getAutofillOptions() { 87 return years; 88 } 89 }); 90 findViewById(R.id.submit).setOnClickListener(new View.OnClickListener() { 91 @Override 92 public void onClick(View v) { 93 submit(); 94 } 95 }); 96 findViewById(R.id.clear).setOnClickListener(new View.OnClickListener() { 97 @Override 98 public void onClick(View v) { 99 getSystemService(AutofillManager.class).cancel(); 100 resetFields(); 101 } 102 }); 103 } 104 105 private void resetFields() { 106 mCcExpirationDaySpinner.setSelection(0); 107 mCcExpirationMonthSpinner.setSelection(0); 108 mCcExpirationYearSpinner.setSelection(0); 109 mCcCardNumber.setText(""); 110 mCcSecurityCode.setText(""); 111 } 112 113 /** 114 * Launches new Activity and finishes, triggering an autofill save request if the user entered 115 * any new data. 116 */ 117 private void submit() { 118 Intent intent = WelcomeActivity.getStartActivityIntent(CreditCardSpinnersActivity.this); 119 startActivity(intent); 120 finish(); 121 } 122 } 123