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