diff options
Diffstat (limited to 'input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/app/CreditCardExpirationDateView.kt')
-rw-r--r-- | input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/app/CreditCardExpirationDateView.kt | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/app/CreditCardExpirationDateView.kt b/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/app/CreditCardExpirationDateView.kt new file mode 100644 index 00000000..609522b3 --- /dev/null +++ b/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/app/CreditCardExpirationDateView.kt @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.android.autofillframework.app + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.autofill.AutofillManager +import android.view.autofill.AutofillValue +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.FrameLayout +import com.example.android.autofillframework.R +import kotlinx.android.synthetic.main.cc_exp_date.view.* +import java.util.Calendar + +class CreditCardExpirationDateView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) { + + private val startYear = Calendar.getInstance().get(Calendar.YEAR) + + init { + LayoutInflater.from(context).inflate(R.layout.cc_exp_date, this) + importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS + val spinnerOnItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, + id: Long) { + context.getSystemService(AutofillManager::class.java) + .notifyValueChanged(this@CreditCardExpirationDateView) + } + + override fun onNothingSelected(parent: AdapterView<*>) = Unit + } + val years = arrayOfNulls<String>(CC_EXP_YEARS_COUNT) + for (i in 0 until years.size) { + years[i] = Integer.toString(startYear + i) + } + + with(ccExpMonth) { + adapter = ArrayAdapter.createFromResource(context, R.array.month_array, + android.R.layout.simple_spinner_item).apply { + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + } + onItemSelectedListener = spinnerOnItemSelectedListener + } + + with(ccExpYear) { + adapter = ArrayAdapter<String>(context, + android.R.layout.simple_spinner_item, years) + onItemSelectedListener = spinnerOnItemSelectedListener + } + } + + override fun getAutofillValue() = + AutofillValue.forDate(Calendar.getInstance().apply { + // clear() sets hours, minutes, seconds, and millis to 0 to ensure that after + // autofill() is called, getAutofillValue() == the value that was originally passed + // into autofill(). Without clear(), the view will not turn yellow when updated. + clear() + val year = Integer.parseInt(ccExpYear.selectedItem.toString()) + val month = ccExpMonth.selectedItemPosition + set(Calendar.YEAR, year) + set(Calendar.MONTH, month) + }.timeInMillis) + + override fun autofill(value: AutofillValue) { + if (!value.isDate) { + return + } + val calendar = Calendar.getInstance().apply { + timeInMillis = value.dateValue + } + val month = calendar.get(Calendar.MONTH) + val year = calendar.get(Calendar.YEAR) + ccExpMonth.setSelection(month) + ccExpYear.setSelection(year - startYear) + } + + override fun getAutofillType() = View.AUTOFILL_TYPE_DATE + + fun reset() { + ccExpMonth.setSelection(0) + ccExpYear.setSelection(0) + } + + companion object { + private const val CC_EXP_YEARS_COUNT = 5 + } +}
\ No newline at end of file |