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