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 17package com.android.settings.applications; 18 19import android.app.AlertDialog; 20import android.content.ComponentName; 21import android.content.DialogInterface; 22import android.os.Bundle; 23import android.os.Handler; 24import android.preference.Preference; 25import android.preference.SwitchPreference; 26import android.provider.Settings; 27 28import com.android.internal.logging.MetricsLogger; 29import com.android.settings.InstrumentedFragment; 30import com.android.settings.R; 31import com.android.settings.SettingsPreferenceFragment; 32import com.android.settings.voice.VoiceInputListPreference; 33 34/** 35 * Settings screen to manage everything about assist. 36 */ 37public 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