Home | History | Annotate | Download | only in settings
      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.autofillframework.multidatasetservice.settings
     17 
     18 import android.os.Bundle
     19 import android.support.v7.app.AlertDialog
     20 import android.support.v7.app.AppCompatActivity
     21 import android.view.LayoutInflater
     22 import android.view.View
     23 import android.view.ViewGroup
     24 import android.widget.CompoundButton
     25 import android.widget.EditText
     26 import android.widget.ImageView
     27 import android.widget.Switch
     28 import android.widget.TextView
     29 import com.example.android.autofillframework.R
     30 import com.example.android.autofillframework.multidatasetservice.datasource.SharedPrefsAutofillRepository
     31 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_credentials_container
     32 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_credentials_icon
     33 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_credentials_label
     34 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_datasets_container
     35 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_datasets_label
     36 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_datasets_switch
     37 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_responses_container
     38 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_responses_label
     39 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_auth_responses_switch
     40 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_clear_data_container
     41 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_clear_data_icon
     42 import kotlinx.android.synthetic.main.multidataset_service_settings_activity.settings_clear_data_label
     43 
     44 class SettingsActivity : AppCompatActivity() {
     45 
     46     public override fun onCreate(savedInstanceState: Bundle?) {
     47         super.onCreate(savedInstanceState)
     48 
     49         setContentView(R.layout.multidataset_service_settings_activity)
     50         setupSettingsSwitch(settings_auth_responses_container,
     51                 settings_auth_responses_label,
     52                 settings_auth_responses_switch,
     53                 MyPreferences.isResponseAuth(this),
     54                 CompoundButton.OnCheckedChangeListener { compoundButton, b ->
     55                     MyPreferences.setResponseAuth(this@SettingsActivity, b)
     56                 })
     57         setupSettingsSwitch(settings_auth_datasets_container,
     58                 settings_auth_datasets_label,
     59                 settings_auth_datasets_switch,
     60                 MyPreferences.isDatasetAuth(this),
     61                 CompoundButton.OnCheckedChangeListener { compoundButton, b ->
     62                     MyPreferences.setDatasetAuth(this@SettingsActivity, b)
     63                 })
     64         setupSettingsButton(settings_clear_data_container,
     65                 settings_clear_data_label,
     66                 settings_clear_data_icon,
     67                 View.OnClickListener { buildClearDataDialog().show() })
     68 
     69         setupSettingsButton(settings_auth_credentials_container,
     70                 settings_auth_credentials_label,
     71                 settings_auth_credentials_icon,
     72                 View.OnClickListener {
     73                     if (MyPreferences.getMasterPassword(this@SettingsActivity) != null) {
     74                         buildCurrentCredentialsDialog().show()
     75                     } else {
     76                         buildNewCredentialsDialog().show()
     77                     }
     78                 })
     79     }
     80 
     81     private fun buildClearDataDialog(): AlertDialog {
     82         return AlertDialog.Builder(this@SettingsActivity)
     83                 .setMessage(R.string.settings_clear_data_confirmation)
     84                 .setTitle(R.string.settings_clear_data_confirmation_title)
     85                 .setNegativeButton(R.string.cancel, null)
     86                 .setPositiveButton(R.string.ok) { dialog, which ->
     87                     SharedPrefsAutofillRepository.clear(this@SettingsActivity)
     88                     MyPreferences.clearCredentials(this@SettingsActivity)
     89                     dialog.dismiss()
     90                 }
     91                 .create()
     92     }
     93 
     94     private fun prepareCredentialsDialog(): AlertDialog.Builder {
     95         return AlertDialog.Builder(this@SettingsActivity)
     96                 .setTitle(R.string.settings_auth_change_credentials_title)
     97                 .setNegativeButton(R.string.cancel, null)
     98     }
     99 
    100     private fun buildCurrentCredentialsDialog(): AlertDialog {
    101         val currentPasswordField = LayoutInflater
    102                 .from(this@SettingsActivity)
    103                 .inflate(R.layout.multidataset_service_settings_authentication_dialog, null)
    104                 .findViewById<EditText>(R.id.master_password_field)
    105         return prepareCredentialsDialog()
    106                 .setMessage(R.string.settings_auth_enter_current_password)
    107                 .setView(currentPasswordField)
    108                 .setPositiveButton(R.string.ok) { dialog, which ->
    109                     val password = currentPasswordField.text.toString()
    110                     if (MyPreferences.getMasterPassword(this@SettingsActivity) == password) {
    111                         buildNewCredentialsDialog().show()
    112                         dialog.dismiss()
    113                     }
    114                 }
    115                 .create()
    116     }
    117 
    118     private fun buildNewCredentialsDialog(): AlertDialog {
    119         val newPasswordField = LayoutInflater
    120                 .from(this@SettingsActivity)
    121                 .inflate(R.layout.multidataset_service_settings_authentication_dialog, null)
    122                 .findViewById<EditText>(R.id.master_password_field)
    123         return prepareCredentialsDialog()
    124                 .setMessage(R.string.settings_auth_enter_new_password)
    125                 .setView(newPasswordField)
    126                 .setPositiveButton(R.string.ok) { dialog, which ->
    127                     val password = newPasswordField.text.toString()
    128                     MyPreferences.setMasterPassword(this@SettingsActivity, password)
    129                     dialog.dismiss()
    130                 }
    131                 .create()
    132     }
    133 
    134     private fun setupSettingsSwitch(container: ViewGroup, switchLabelView: TextView, switchView: Switch, checked: Boolean,
    135             checkedChangeListener: CompoundButton.OnCheckedChangeListener) {
    136         val switchLabel = switchLabelView.text.toString()
    137         with(switchView) {
    138             contentDescription = switchLabel
    139             isChecked = checked
    140             setOnCheckedChangeListener(checkedChangeListener)
    141         }
    142         container.setOnClickListener { switchView.performClick() }
    143     }
    144 
    145     private fun setupSettingsButton(container: ViewGroup, buttonLabelView: TextView, imageView: ImageView,
    146             onClickListener: View.OnClickListener) {
    147         val buttonLabel = buttonLabelView.text.toString()
    148         imageView.contentDescription = buttonLabel
    149         container.setOnClickListener(onClickListener)
    150     }
    151 }
    152