| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License |
| */ |
| |
| package com.android.settings.applications; |
| |
| import android.app.AlertDialog; |
| import android.content.ComponentName; |
| import android.content.DialogInterface; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.provider.Settings; |
| import android.support.v14.preference.SwitchPreference; |
| import android.support.v7.preference.Preference; |
| |
| import com.android.internal.app.AssistUtils; |
| import com.android.internal.logging.MetricsProto.MetricsEvent; |
| import com.android.settings.R; |
| import com.android.settings.SettingsPreferenceFragment; |
| import com.android.settings.voice.VoiceInputListPreference; |
| |
| /** |
| * Settings screen to manage everything about assist. |
| */ |
| public class ManageAssist extends SettingsPreferenceFragment |
| implements Preference.OnPreferenceChangeListener { |
| |
| private static final String KEY_DEFAULT_ASSIST = "default_assist"; |
| private static final String KEY_CONTEXT = "context"; |
| private static final String KEY_SCREENSHOT = "screenshot"; |
| private static final String KEY_VOICE_INPUT = "voice_input_settings"; |
| private static final String KEY_FLASH = "flash"; |
| |
| private DefaultAssistPreference mDefaultAssitPref; |
| private SwitchPreference mContextPref; |
| private SwitchPreference mScreenshotPref; |
| private SwitchPreference mFlashPref; |
| private VoiceInputListPreference mVoiceInputPref; |
| private Handler mHandler = new Handler(); |
| |
| @Override |
| public void onCreate(Bundle icicle) { |
| super.onCreate(icicle); |
| addPreferencesFromResource(R.xml.manage_assist); |
| |
| mDefaultAssitPref = (DefaultAssistPreference) findPreference(KEY_DEFAULT_ASSIST); |
| mDefaultAssitPref.setOnPreferenceChangeListener(this); |
| |
| mContextPref = (SwitchPreference) findPreference(KEY_CONTEXT); |
| mContextPref.setChecked(Settings.Secure.getInt(getContentResolver(), |
| Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1) != 0); |
| mContextPref.setOnPreferenceChangeListener(this); |
| |
| mScreenshotPref = (SwitchPreference) findPreference(KEY_SCREENSHOT); |
| mScreenshotPref.setOnPreferenceChangeListener(this); |
| |
| mFlashPref = (SwitchPreference) findPreference(KEY_FLASH); |
| mFlashPref.setOnPreferenceChangeListener(this); |
| |
| mVoiceInputPref = (VoiceInputListPreference) findPreference(KEY_VOICE_INPUT); |
| updateUi(); |
| } |
| |
| @Override |
| protected int getMetricsCategory() { |
| return MetricsEvent.APPLICATIONS_MANAGE_ASSIST; |
| } |
| |
| @Override |
| public boolean onPreferenceChange(Preference preference, Object newValue) { |
| if (preference == mContextPref) { |
| Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSIST_STRUCTURE_ENABLED, |
| (boolean) newValue ? 1 : 0); |
| mHandler.post(() -> { |
| guardScreenshotPref(); |
| guardFlashPref(); |
| }); |
| return true; |
| } |
| if (preference == mScreenshotPref) { |
| Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSIST_SCREENSHOT_ENABLED, |
| (boolean) newValue ? 1 : 0); |
| return true; |
| } |
| if (preference == mFlashPref) { |
| Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSIST_DISCLOSURE_ENABLED, |
| (boolean) newValue ? 1 : 0); |
| return true; |
| } |
| if (preference == mDefaultAssitPref) { |
| String newAssitPackage = (String)newValue; |
| if (newAssitPackage == null || |
| newAssitPackage.contentEquals(DefaultAssistPreference.ITEM_NONE_VALUE)) { |
| setDefaultAssist(DefaultAssistPreference.ITEM_NONE_VALUE); |
| return false; |
| } |
| |
| final String currentPackage = mDefaultAssitPref.getValue(); |
| if (currentPackage == null || !newAssitPackage.contentEquals(currentPackage)) { |
| confirmNewAssist(newAssitPackage); |
| } |
| return false; |
| } |
| return false; |
| } |
| |
| private void guardScreenshotPref() { |
| boolean isChecked = mContextPref.isChecked(); |
| boolean screenshotPrefWasSet = Settings.Secure.getInt( |
| getContentResolver(), Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1) != 0; |
| mScreenshotPref.setEnabled(isChecked); |
| mScreenshotPref.setChecked(isChecked && screenshotPrefWasSet); |
| } |
| |
| private void guardFlashPref() { |
| ComponentName assistant = mDefaultAssitPref.getCurrentAssist(); |
| |
| boolean isContextChecked = mContextPref.isChecked(); |
| boolean willShowFlash = AssistUtils.shouldDisclose(getContext(), assistant); |
| boolean isSystemAssistant = AssistUtils.isPreinstalledAssistant(getContext(), assistant); |
| |
| mFlashPref.setEnabled(isContextChecked && isSystemAssistant); |
| mFlashPref.setChecked(willShowFlash); |
| } |
| |
| private void updateUi() { |
| mDefaultAssitPref.refreshAssistApps(); |
| mVoiceInputPref.refreshVoiceInputs(); |
| |
| final ComponentName currentAssist = mDefaultAssitPref.getCurrentAssist(); |
| final boolean hasAssistant = currentAssist != null; |
| if (hasAssistant) { |
| getPreferenceScreen().addPreference(mContextPref); |
| getPreferenceScreen().addPreference(mScreenshotPref); |
| } else { |
| getPreferenceScreen().removePreference(mContextPref); |
| getPreferenceScreen().removePreference(mScreenshotPref); |
| getPreferenceScreen().removePreference(mFlashPref); |
| } |
| |
| if (hasAssistant && AssistUtils.allowDisablingAssistDisclosure(getContext())) { |
| getPreferenceScreen().addPreference(mFlashPref); |
| } else { |
| getPreferenceScreen().removePreference(mFlashPref); |
| } |
| |
| if (isCurrentAssistVoiceService()) { |
| getPreferenceScreen().removePreference(mVoiceInputPref); |
| } else { |
| getPreferenceScreen().addPreference(mVoiceInputPref); |
| mVoiceInputPref.setAssistRestrict(currentAssist); |
| } |
| |
| guardScreenshotPref(); |
| guardFlashPref(); |
| } |
| |
| private boolean isCurrentAssistVoiceService() { |
| ComponentName currentAssist = mDefaultAssitPref.getCurrentAssist(); |
| ComponentName activeService = mVoiceInputPref.getCurrentService(); |
| return currentAssist == null && activeService == null || |
| currentAssist != null && currentAssist.equals(activeService); |
| } |
| |
| private void confirmNewAssist(final String newAssitPackage) { |
| final int selected = mDefaultAssitPref.findIndexOfValue(newAssitPackage); |
| final CharSequence appLabel = mDefaultAssitPref.getEntries()[selected]; |
| |
| final String title = getString(R.string.assistant_security_warning_title, appLabel); |
| final String message = getString(R.string.assistant_security_warning, appLabel); |
| |
| final DialogInterface.OnClickListener onAgree = new DialogInterface.OnClickListener() { |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| setDefaultAssist(newAssitPackage); |
| } |
| }; |
| |
| AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); |
| builder.setTitle(title) |
| .setMessage(message) |
| .setCancelable(true) |
| .setPositiveButton(R.string.assistant_security_warning_agree, onAgree) |
| .setNegativeButton(R.string.assistant_security_warning_disagree, null); |
| AlertDialog dialog = builder.create(); |
| dialog.show(); |
| } |
| |
| private void setDefaultAssist(String assistPackage) { |
| mDefaultAssitPref.setValue(assistPackage); |
| updateUi(); |
| } |
| } |