Home | History | Annotate | Download | only in applications
      1 /*
      2  * Copyright (C) 2015 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.settings.applications;
     18 
     19 import android.app.AlertDialog;
     20 import android.content.ComponentName;
     21 import android.content.DialogInterface;
     22 import android.os.Bundle;
     23 import android.os.Handler;
     24 import android.preference.Preference;
     25 import android.preference.SwitchPreference;
     26 import android.provider.Settings;
     27 
     28 import com.android.internal.logging.MetricsLogger;
     29 import com.android.settings.InstrumentedFragment;
     30 import com.android.settings.R;
     31 import com.android.settings.SettingsPreferenceFragment;
     32 import com.android.settings.voice.VoiceInputListPreference;
     33 
     34 /**
     35  * Settings screen to manage everything about assist.
     36  */
     37 public class ManageAssist extends SettingsPreferenceFragment
     38         implements Preference.OnPreferenceChangeListener {
     39 
     40     private static final String KEY_DEFAULT_ASSIST = "default_assist";
     41     private static final String KEY_CONTEXT = "context";
     42     private static final String KEY_SCREENSHOT = "screenshot";
     43     private static final String KEY_VOICE_INPUT = "voice_input_settings";
     44 
     45     private DefaultAssistPreference mDefaultAssitPref;
     46     private SwitchPreference mContextPref;
     47     private SwitchPreference mScreenshotPref;
     48     private VoiceInputListPreference mVoiceInputPref;
     49     private Handler mHandler = new Handler();
     50 
     51     @Override
     52     public void onCreate(Bundle icicle) {
     53         super.onCreate(icicle);
     54         addPreferencesFromResource(R.xml.manage_assist);
     55 
     56         mDefaultAssitPref = (DefaultAssistPreference) findPreference(KEY_DEFAULT_ASSIST);
     57         mDefaultAssitPref.setOnPreferenceChangeListener(this);
     58 
     59         mContextPref = (SwitchPreference) findPreference(KEY_CONTEXT);
     60         mContextPref.setChecked(Settings.Secure.getInt(getContentResolver(),
     61                 Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1) != 0);
     62         mContextPref.setOnPreferenceChangeListener(this);
     63 
     64         mScreenshotPref = (SwitchPreference) findPreference(KEY_SCREENSHOT);
     65         mScreenshotPref.setChecked(Settings.Secure.getInt(getContentResolver(),
     66                 Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1) != 0);
     67         mScreenshotPref.setOnPreferenceChangeListener(this);
     68 
     69         mVoiceInputPref = (VoiceInputListPreference) findPreference(KEY_VOICE_INPUT);
     70         updateUi();
     71     }
     72 
     73     @Override
     74     protected int getMetricsCategory() {
     75         return MetricsLogger.APPLICATIONS_MANAGE_ASSIST;
     76     }
     77 
     78     @Override
     79     public boolean onPreferenceChange(Preference preference, Object newValue) {
     80         if (preference == mContextPref) {
     81             Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSIST_STRUCTURE_ENABLED,
     82                     (boolean) newValue ? 1 : 0);
     83             postUpdateUi();
     84             return true;
     85         }
     86         if (preference == mScreenshotPref) {
     87             Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSIST_SCREENSHOT_ENABLED,
     88                     (boolean) newValue ? 1 : 0);
     89             return true;
     90         }
     91         if (preference == mDefaultAssitPref) {
     92             String newAssitPackage = (String)newValue;
     93             if (newAssitPackage == null ||
     94                     newAssitPackage.contentEquals(DefaultAssistPreference.ITEM_NONE_VALUE)) {
     95                 setDefaultAssist(DefaultAssistPreference.ITEM_NONE_VALUE);
     96                 return false;
     97             }
     98 
     99             final String currentPackage = mDefaultAssitPref.getValue();
    100             if (currentPackage == null || !newAssitPackage.contentEquals(currentPackage)) {
    101                 confirmNewAssist(newAssitPackage);
    102             }
    103             return false;
    104         }
    105         return false;
    106     }
    107 
    108     private void postUpdateUi() {
    109         mHandler.post(new Runnable() {
    110             @Override
    111             public void run() {
    112                 updateUi();
    113             }
    114         });
    115     }
    116 
    117     private void updateUi() {
    118         mDefaultAssitPref.refreshAssistApps();
    119         mVoiceInputPref.refreshVoiceInputs();
    120 
    121         final ComponentName currentAssist = mDefaultAssitPref.getCurrentAssist();
    122         final boolean hasAssistant = currentAssist != null;
    123         if (hasAssistant) {
    124             getPreferenceScreen().addPreference(mContextPref);
    125             getPreferenceScreen().addPreference(mScreenshotPref);
    126         } else {
    127             getPreferenceScreen().removePreference(mContextPref);
    128             getPreferenceScreen().removePreference(mScreenshotPref);
    129         }
    130 
    131         if (isCurrentAssistVoiceService()) {
    132             getPreferenceScreen().removePreference(mVoiceInputPref);
    133         } else {
    134             getPreferenceScreen().addPreference(mVoiceInputPref);
    135             mVoiceInputPref.setAssistRestrict(currentAssist);
    136         }
    137 
    138         mScreenshotPref.setEnabled(mContextPref.isChecked());
    139         if (!mContextPref.isChecked()) {
    140             mScreenshotPref.setChecked(false);
    141         }
    142     }
    143 
    144     private boolean isCurrentAssistVoiceService() {
    145         ComponentName currentAssist = mDefaultAssitPref.getCurrentAssist();
    146         ComponentName activeService = mVoiceInputPref.getCurrentService();
    147         return currentAssist == null && activeService == null ||
    148                 currentAssist != null && currentAssist.equals(activeService);
    149     }
    150 
    151     private void confirmNewAssist(final String newAssitPackage) {
    152         final int selected = mDefaultAssitPref.findIndexOfValue(newAssitPackage);
    153         final CharSequence appLabel = mDefaultAssitPref.getEntries()[selected];
    154 
    155         final String title = getString(R.string.assistant_security_warning_title, appLabel);
    156         final String message = getString(R.string.assistant_security_warning, appLabel);
    157 
    158         final DialogInterface.OnClickListener onAgree = new DialogInterface.OnClickListener() {
    159             @Override
    160             public void onClick(DialogInterface dialog, int which) {
    161                 setDefaultAssist(newAssitPackage);
    162             }
    163         };
    164 
    165         AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    166         builder.setTitle(title)
    167                 .setMessage(message)
    168                 .setCancelable(true)
    169                 .setPositiveButton(R.string.assistant_security_warning_agree, onAgree)
    170                 .setNegativeButton(R.string.assistant_security_warning_disagree, null);
    171         AlertDialog dialog = builder.create();
    172         dialog.show();
    173     }
    174 
    175     private void setDefaultAssist(String assistPackage) {
    176         mDefaultAssitPref.setValue(assistPackage);
    177         updateUi();
    178     }
    179 }
    180