blob: 704d17a1f84084907cc3ca266c3302e565de30cc [file] [log] [blame]
/*
* 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.multidatasetservice
import android.os.CancellationSignal
import android.service.autofill.AutofillService
import android.service.autofill.FillCallback
import android.service.autofill.FillRequest
import android.service.autofill.FillResponse
import android.service.autofill.SaveCallback
import android.service.autofill.SaveRequest
import android.util.Log
import android.widget.Toast
import com.example.android.autofillframework.CommonUtil.TAG
import com.example.android.autofillframework.CommonUtil.bundleToString
import com.example.android.autofillframework.R
import com.example.android.autofillframework.multidatasetservice.datasource.SharedPrefsAutofillRepository
import com.example.android.autofillframework.multidatasetservice.settings.MyPreferences
class MyAutofillService : AutofillService() {
override fun onFillRequest(request: FillRequest, cancellationSignal: CancellationSignal,
callback: FillCallback) {
val structure = request.fillContexts[request.fillContexts.size - 1].structure
val packageName = structure.activityComponent.packageName
if (!PackageVerifier.isValidPackage(applicationContext, packageName)) {
Toast.makeText(applicationContext, R.string.invalid_package_signature,
Toast.LENGTH_SHORT).show()
return
}
val data = request.clientState
Log.d(TAG, "onFillRequest(): data=" + bundleToString(data))
cancellationSignal.setOnCancelListener { Log.w(TAG, "Cancel autofill not implemented in this sample.") }
// Parse AutoFill data in Activity
val parser = StructureParser(structure)
parser.parseForFill()
val autofillFields = parser.autofillFields
val responseBuilder = FillResponse.Builder()
// Check user's settings for authenticating Responses and Datasets.
val responseAuth = MyPreferences.isResponseAuth(this)
if (responseAuth && autofillFields.autofillIds.size > 0) {
// If the entire Autofill Response is authenticated, AuthActivity is used
// to generate Response.
val sender = AuthActivity.getAuthIntentSenderForResponse(this)
val presentation = AutofillHelper
.newRemoteViews(packageName, getString(R.string.autofill_sign_in_prompt), R.drawable.ic_lock_black_24dp)
responseBuilder
.setAuthentication(autofillFields.autofillIds.toTypedArray(), sender, presentation)
callback.onSuccess(responseBuilder.build())
} else {
val datasetAuth = MyPreferences.isDatasetAuth(this)
val clientFormDataMap = SharedPrefsAutofillRepository.getFilledAutofillFieldCollection(this,
autofillFields.focusedAutofillHints, autofillFields.allAutofillHints)
val response = AutofillHelper.newResponse(this, datasetAuth, autofillFields, clientFormDataMap)
callback.onSuccess(response)
}
}
override fun onSaveRequest(request: SaveRequest, callback: SaveCallback) {
val context = request.fillContexts
val structure = context[context.size - 1].structure
val packageName = structure.activityComponent.packageName
if (!PackageVerifier.isValidPackage(applicationContext, packageName)) {
Toast.makeText(applicationContext, R.string.invalid_package_signature,
Toast.LENGTH_SHORT).show()
return
}
val data = request.clientState
Log.d(TAG, "onSaveRequest(): data=" + bundleToString(data))
val parser = StructureParser(structure)
parser.parseForSave()
SharedPrefsAutofillRepository.saveFilledAutofillFieldCollection(this,
parser.filledAutofillFieldCollection)
}
override fun onConnected() {
Log.d(TAG, "onConnected")
}
override fun onDisconnected() {
Log.d(TAG, "onDisconnected")
}
}