1 /* 2 * Copyright (C) 2011 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.phone; 18 19 import android.app.ActivityManager; 20 import android.app.ActionBar; 21 import android.app.AlertDialog; 22 import android.app.Dialog; 23 import android.content.ComponentName; 24 import android.content.Context; 25 import android.content.DialogInterface; 26 import android.content.Intent; 27 import android.content.SharedPreferences; 28 import android.content.pm.ApplicationInfo; 29 import android.content.pm.PackageInfo; 30 import android.content.pm.PackageManager; 31 import android.content.pm.PackageManager; 32 import android.content.pm.ResolveInfo; 33 import android.content.pm.ServiceInfo; 34 import android.content.res.Resources; 35 import android.graphics.drawable.Drawable; 36 import android.net.Uri; 37 import android.os.Bundle; 38 import android.os.SystemProperties; 39 import android.preference.EditTextPreference; 40 import android.preference.Preference; 41 import android.preference.PreferenceActivity; 42 import android.telephony.PhoneNumberUtils; 43 import android.telephony.TelephonyManager; 44 import android.text.TextUtils; 45 import android.util.Log; 46 import android.view.LayoutInflater; 47 import android.view.Menu; 48 import android.view.MenuItem; 49 import android.view.View; 50 import android.view.ViewGroup; 51 import android.widget.AdapterView; 52 import android.widget.ArrayAdapter; 53 import android.widget.BaseAdapter; 54 import android.widget.CheckBox; 55 import android.widget.CompoundButton; 56 import android.widget.ImageView; 57 import android.widget.ListView; 58 import android.widget.TextView; 59 import android.widget.Toast; 60 61 import com.android.internal.telephony.Call; 62 import com.android.internal.telephony.Connection; 63 import com.android.internal.telephony.PhoneConstants; 64 65 import com.google.android.collect.Lists; 66 67 import java.util.ArrayList; 68 import java.util.Arrays; 69 import java.util.List; 70 71 /** 72 * Helper class to manage the "Respond via Message" feature for incoming calls. 73 * 74 * @see InCallScreen.internalRespondViaSms() 75 */ 76 public class RespondViaSmsManager { 77 private static final String TAG = "RespondViaSmsManager"; 78 private static final boolean DBG = 79 (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1); 80 // Do not check in with VDBG = true, since that may write PII to the system log. 81 private static final boolean VDBG = false; 82 83 /** SharedPreferences file name for our persistent settings. */ 84 private static final String SHARED_PREFERENCES_NAME = "respond_via_sms_prefs"; 85 86 // Preference keys for the 4 "canned responses"; see RespondViaSmsManager$Settings. 87 // Since (for now at least) the number of messages is fixed at 4, and since 88 // SharedPreferences can't deal with arrays anyway, just store the messages 89 // as 4 separate strings. 90 private static final int NUM_CANNED_RESPONSES = 4; 91 private static final String KEY_CANNED_RESPONSE_PREF_1 = "canned_response_pref_1"; 92 private static final String KEY_CANNED_RESPONSE_PREF_2 = "canned_response_pref_2"; 93 private static final String KEY_CANNED_RESPONSE_PREF_3 = "canned_response_pref_3"; 94 private static final String KEY_CANNED_RESPONSE_PREF_4 = "canned_response_pref_4"; 95 private static final String KEY_PREFERRED_PACKAGE = "preferred_package_pref"; 96 private static final String KEY_INSTANT_TEXT_DEFAULT_COMPONENT = "instant_text_def_component"; 97 98 /** 99 * Settings activity under "Call settings" to let you manage the 100 * canned responses; see respond_via_sms_settings.xml 101 */ 102 public static class Settings extends PreferenceActivity 103 implements Preference.OnPreferenceChangeListener { 104 @Override 105 protected void onCreate(Bundle icicle) { 106 super.onCreate(icicle); 107 if (DBG) log("Settings: onCreate()..."); 108 109 getPreferenceManager().setSharedPreferencesName(SHARED_PREFERENCES_NAME); 110 111 // This preference screen is ultra-simple; it's just 4 plain 112 // <EditTextPreference>s, one for each of the 4 "canned responses". 113 // 114 // The only nontrivial thing we do here is copy the text value of 115 // each of those EditTextPreferences and use it as the preference's 116 // "title" as well, so that the user will immediately see all 4 117 // strings when they arrive here. 118 // 119 // Also, listen for change events (since we'll need to update the 120 // title any time the user edits one of the strings.) 121 122 addPreferencesFromResource(R.xml.respond_via_sms_settings); 123 124 EditTextPreference pref; 125 pref = (EditTextPreference) findPreference(KEY_CANNED_RESPONSE_PREF_1); 126 pref.setTitle(pref.getText()); 127 pref.setOnPreferenceChangeListener(this); 128 129 pref = (EditTextPreference) findPreference(KEY_CANNED_RESPONSE_PREF_2); 130 pref.setTitle(pref.getText()); 131 pref.setOnPreferenceChangeListener(this); 132 133 pref = (EditTextPreference) findPreference(KEY_CANNED_RESPONSE_PREF_3); 134 pref.setTitle(pref.getText()); 135 pref.setOnPreferenceChangeListener(this); 136 137 pref = (EditTextPreference) findPreference(KEY_CANNED_RESPONSE_PREF_4); 138 pref.setTitle(pref.getText()); 139 pref.setOnPreferenceChangeListener(this); 140 141 ActionBar actionBar = getActionBar(); 142 if (actionBar != null) { 143 // android.R.id.home will be triggered in onOptionsItemSelected() 144 actionBar.setDisplayHomeAsUpEnabled(true); 145 } 146 } 147 148 // Preference.OnPreferenceChangeListener implementation 149 @Override 150 public boolean onPreferenceChange(Preference preference, Object newValue) { 151 if (DBG) log("onPreferenceChange: key = " + preference.getKey()); 152 if (VDBG) log(" preference = '" + preference + "'"); 153 if (VDBG) log(" newValue = '" + newValue + "'"); 154 155 EditTextPreference pref = (EditTextPreference) preference; 156 157 // Copy the new text over to the title, just like in onCreate(). 158 // (Watch out: onPreferenceChange() is called *before* the 159 // Preference itself gets updated, so we need to use newValue here 160 // rather than pref.getText().) 161 pref.setTitle((String) newValue); 162 163 return true; // means it's OK to update the state of the Preference with the new value 164 } 165 166 @Override 167 public boolean onOptionsItemSelected(MenuItem item) { 168 final int itemId = item.getItemId(); 169 switch (itemId) { 170 case android.R.id.home: 171 // See ActionBar#setDisplayHomeAsUpEnabled() 172 CallFeaturesSetting.goUpToTopLevelSetting(this); 173 return true; 174 case R.id.respond_via_message_reset: 175 // Reset the preferences settings 176 SharedPreferences prefs = getSharedPreferences( 177 SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); 178 SharedPreferences.Editor editor = prefs.edit(); 179 editor.remove(KEY_INSTANT_TEXT_DEFAULT_COMPONENT); 180 editor.apply(); 181 182 return true; 183 default: 184 } 185 return super.onOptionsItemSelected(item); 186 } 187 188 @Override 189 public boolean onCreateOptionsMenu(Menu menu) { 190 getMenuInflater().inflate(R.menu.respond_via_message_settings_menu, menu); 191 return super.onCreateOptionsMenu(menu); 192 } 193 } 194 195 private static void log(String msg) { 196 Log.e(TAG, msg); 197 } 198 } 199