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