1 /* 2 * Copyright (C) 2017 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.assist; 18 19 import android.content.ComponentName; 20 import android.content.Context; 21 import android.content.Intent; 22 import android.content.pm.PackageManager; 23 import android.net.Uri; 24 import android.text.TextUtils; 25 26 import androidx.preference.Preference; 27 import androidx.preference.PreferenceScreen; 28 29 import com.android.settings.applications.defaultapps.DefaultAppPreferenceController; 30 import com.android.settingslib.applications.DefaultAppInfo; 31 import com.android.settingslib.core.lifecycle.Lifecycle; 32 import com.android.settingslib.core.lifecycle.LifecycleObserver; 33 import com.android.settingslib.core.lifecycle.events.OnPause; 34 import com.android.settingslib.core.lifecycle.events.OnResume; 35 36 import java.util.List; 37 38 public class DefaultVoiceInputPreferenceController extends DefaultAppPreferenceController 39 implements LifecycleObserver, OnResume, OnPause { 40 41 private static final String KEY_VOICE_INPUT = "voice_input_settings"; 42 43 private VoiceInputHelper mHelper; 44 private PreferenceScreen mScreen; 45 private Preference mPreference; 46 private Context mContext; 47 DefaultVoiceInputPreferenceController(Context context, Lifecycle lifecycle)48 public DefaultVoiceInputPreferenceController(Context context, Lifecycle lifecycle) { 49 super(context); 50 mContext = context; 51 mHelper = new VoiceInputHelper(context); 52 mHelper.buildUi(); 53 if (lifecycle != null) { 54 lifecycle.addObserver(this); 55 } 56 } 57 58 @Override isAvailable()59 public boolean isAvailable() { 60 return mContext.getPackageManager().hasSystemFeature( 61 PackageManager.FEATURE_VOICE_RECOGNIZERS); 62 } 63 64 @Override getPreferenceKey()65 public String getPreferenceKey() { 66 return KEY_VOICE_INPUT; 67 } 68 69 @Override displayPreference(PreferenceScreen screen)70 public void displayPreference(PreferenceScreen screen) { 71 mScreen = screen; 72 mPreference = screen.findPreference(getPreferenceKey()); 73 super.displayPreference(screen); 74 } 75 76 @Override onResume()77 public void onResume() { 78 updatePreference(); 79 } 80 81 @Override updateState(Preference preference)82 public void updateState(Preference preference) { 83 super.updateState(mPreference); 84 updatePreference(); 85 } 86 87 @Override onPause()88 public void onPause() {} 89 90 @Override getDefaultAppInfo()91 protected DefaultAppInfo getDefaultAppInfo() { 92 final String defaultKey = getDefaultAppKey(); 93 if (defaultKey == null) { 94 return null; 95 } 96 97 for (VoiceInputHelper.RecognizerInfo info : mHelper.mAvailableRecognizerInfos) { 98 if (TextUtils.equals(defaultKey, info.key)) { 99 return new DefaultVoiceInputPicker.VoiceInputDefaultAppInfo(mContext, 100 mPackageManager, mUserId, info, true /* enabled */); 101 } 102 } 103 return null; 104 } 105 106 @Override getSettingIntent(DefaultAppInfo info)107 protected Intent getSettingIntent(DefaultAppInfo info) { 108 final DefaultAppInfo appInfo = getDefaultAppInfo(); 109 if (appInfo == null 110 || !(appInfo instanceof DefaultVoiceInputPicker.VoiceInputDefaultAppInfo)) { 111 return null; 112 } 113 return ((DefaultVoiceInputPicker.VoiceInputDefaultAppInfo) appInfo).getSettingIntent(); 114 } 115 updatePreference()116 private void updatePreference() { 117 if (mPreference == null) { 118 return; 119 } 120 mHelper.buildUi(); 121 if (isAvailable()) { 122 if (mScreen.findPreference(getPreferenceKey()) == null) { 123 // add it if it's not on scree 124 mScreen.addPreference(mPreference); 125 } 126 } else { 127 mScreen.removePreference(mPreference); 128 } 129 } 130 getDefaultAppKey()131 private String getDefaultAppKey() { 132 final ComponentName currentService = DefaultVoiceInputPicker.getCurrentService(mHelper); 133 if (currentService == null) { 134 return null; 135 } 136 return currentService.flattenToShortString(); 137 } 138 } 139