RespondViaSmsManager.java revision 524486403a387c324dee5aff7fb78ca784d15255
19e25b785cc7edae682144536f58080edb3a374e4David Brown/* 29e25b785cc7edae682144536f58080edb3a374e4David Brown * Copyright (C) 2011 The Android Open Source Project 39e25b785cc7edae682144536f58080edb3a374e4David Brown * 49e25b785cc7edae682144536f58080edb3a374e4David Brown * Licensed under the Apache License, Version 2.0 (the "License"); 59e25b785cc7edae682144536f58080edb3a374e4David Brown * you may not use this file except in compliance with the License. 69e25b785cc7edae682144536f58080edb3a374e4David Brown * You may obtain a copy of the License at 79e25b785cc7edae682144536f58080edb3a374e4David Brown * 89e25b785cc7edae682144536f58080edb3a374e4David Brown * http://www.apache.org/licenses/LICENSE-2.0 99e25b785cc7edae682144536f58080edb3a374e4David Brown * 109e25b785cc7edae682144536f58080edb3a374e4David Brown * Unless required by applicable law or agreed to in writing, software 119e25b785cc7edae682144536f58080edb3a374e4David Brown * distributed under the License is distributed on an "AS IS" BASIS, 129e25b785cc7edae682144536f58080edb3a374e4David Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e25b785cc7edae682144536f58080edb3a374e4David Brown * See the License for the specific language governing permissions and 149e25b785cc7edae682144536f58080edb3a374e4David Brown * limitations under the License. 159e25b785cc7edae682144536f58080edb3a374e4David Brown */ 169e25b785cc7edae682144536f58080edb3a374e4David Brown 179e25b785cc7edae682144536f58080edb3a374e4David Brownpackage com.android.phone; 189e25b785cc7edae682144536f58080edb3a374e4David Brown 1901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport android.app.AlertDialog; 2001ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport android.app.Dialog; 219e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.content.Context; 2201ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport android.content.DialogInterface; 239e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.content.Intent; 249e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.net.Uri; 259e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.os.SystemProperties; 269e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.telephony.SmsManager; 279e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.util.Log; 289e25b785cc7edae682144536f58080edb3a374e4David Brownimport android.view.View; 2901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport android.widget.AdapterView; 3001ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport android.widget.ArrayAdapter; 3101ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport android.widget.ListView; 329e25b785cc7edae682144536f58080edb3a374e4David Brown 339e25b785cc7edae682144536f58080edb3a374e4David Brownimport com.android.internal.telephony.Call; 349e25b785cc7edae682144536f58080edb3a374e4David Brownimport com.android.internal.telephony.Connection; 359e25b785cc7edae682144536f58080edb3a374e4David Brown 3601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brownimport java.util.Arrays; 379e25b785cc7edae682144536f58080edb3a374e4David Brown 389e25b785cc7edae682144536f58080edb3a374e4David Brown/** 39524486403a387c324dee5aff7fb78ca784d15255David Brown * Helper class to manage the "Respond via SMS" feature for incoming calls. 40524486403a387c324dee5aff7fb78ca784d15255David Brown * @see InCallScreen.internalRespondViaSms() 419e25b785cc7edae682144536f58080edb3a374e4David Brown */ 42524486403a387c324dee5aff7fb78ca784d15255David Brownpublic class RespondViaSmsManager { 43524486403a387c324dee5aff7fb78ca784d15255David Brown private static final String TAG = "RespondViaSmsManager"; 4411544975bb29ede282333209e945a75430b221a8David Brown private static final boolean DBG = true; 4511544975bb29ede282333209e945a75430b221a8David Brown // STOPSHIP: reduce DBG to 4611544975bb29ede282333209e945a75430b221a8David Brown // (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1); 479e25b785cc7edae682144536f58080edb3a374e4David Brown 48524486403a387c324dee5aff7fb78ca784d15255David Brown /** 49524486403a387c324dee5aff7fb78ca784d15255David Brown * Reference to the InCallScreen activity that owns us. This may be 50524486403a387c324dee5aff7fb78ca784d15255David Brown * null if we haven't been initialized yet *or* after the InCallScreen 51524486403a387c324dee5aff7fb78ca784d15255David Brown * activity has been destroyed. 52524486403a387c324dee5aff7fb78ca784d15255David Brown */ 53524486403a387c324dee5aff7fb78ca784d15255David Brown private InCallScreen mInCallScreen; 54524486403a387c324dee5aff7fb78ca784d15255David Brown 55524486403a387c324dee5aff7fb78ca784d15255David Brown /** 56524486403a387c324dee5aff7fb78ca784d15255David Brown * The popup showing the list of canned responses. 57524486403a387c324dee5aff7fb78ca784d15255David Brown * 58524486403a387c324dee5aff7fb78ca784d15255David Brown * This is an AlertDialog containing a ListView showing the possible 59524486403a387c324dee5aff7fb78ca784d15255David Brown * choices. This may be null if the InCallScreen hasn't ever called 60524486403a387c324dee5aff7fb78ca784d15255David Brown * showRespondViaSmsPopup() yet, or if the popup was visible once but 61524486403a387c324dee5aff7fb78ca784d15255David Brown * then got dismissed. 62524486403a387c324dee5aff7fb78ca784d15255David Brown */ 63524486403a387c324dee5aff7fb78ca784d15255David Brown private Dialog mPopup; 64524486403a387c324dee5aff7fb78ca784d15255David Brown 65524486403a387c324dee5aff7fb78ca784d15255David Brown /** 66524486403a387c324dee5aff7fb78ca784d15255David Brown * RespondViaSmsManager constructor. 67524486403a387c324dee5aff7fb78ca784d15255David Brown */ 68524486403a387c324dee5aff7fb78ca784d15255David Brown public RespondViaSmsManager() { 69524486403a387c324dee5aff7fb78ca784d15255David Brown } 70524486403a387c324dee5aff7fb78ca784d15255David Brown 71524486403a387c324dee5aff7fb78ca784d15255David Brown public void setInCallScreenInstance(InCallScreen inCallScreen) { 72524486403a387c324dee5aff7fb78ca784d15255David Brown mInCallScreen = inCallScreen; 739e25b785cc7edae682144536f58080edb3a374e4David Brown } 749e25b785cc7edae682144536f58080edb3a374e4David Brown 759e25b785cc7edae682144536f58080edb3a374e4David Brown /** 7601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown * Brings up the "Respond via SMS" popup for an incoming call. 779e25b785cc7edae682144536f58080edb3a374e4David Brown * 789e25b785cc7edae682144536f58080edb3a374e4David Brown * @param ringingCall the current incoming call 799e25b785cc7edae682144536f58080edb3a374e4David Brown */ 80524486403a387c324dee5aff7fb78ca784d15255David Brown public void showRespondViaSmsPopup(Call ringingCall) { 819e25b785cc7edae682144536f58080edb3a374e4David Brown if (DBG) log("showRespondViaSmsPopup()..."); 829e25b785cc7edae682144536f58080edb3a374e4David Brown 83524486403a387c324dee5aff7fb78ca784d15255David Brown ListView lv = new ListView(mInCallScreen); 8401ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown 8501ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // Load the canned responses come from an array resource. 8601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // TODO: This will eventually come from a SharedPreferences, since 8701ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // the responses need to be customizable. (Ultimately the 8801ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // respond_via_sms_canned_responses strings will only be used as 8901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // default values.) 90524486403a387c324dee5aff7fb78ca784d15255David Brown String[] responses = mInCallScreen.getResources() 9101ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown .getStringArray(R.array.respond_via_sms_canned_responses); 9201ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown 9301ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // And manually add "Custom message..." as the last choice. 9401ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown int numPopupItems = responses.length + 1; 9501ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown String[] popupItems = Arrays.copyOf(responses, numPopupItems); 96524486403a387c324dee5aff7fb78ca784d15255David Brown popupItems[numPopupItems - 1] = mInCallScreen.getResources() 9701ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown .getString(R.string.respond_via_sms_custom_message); 9801ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown 9901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown ArrayAdapter<String> adapter = 100524486403a387c324dee5aff7fb78ca784d15255David Brown new ArrayAdapter<String>(mInCallScreen, 10101ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown android.R.layout.simple_list_item_1, 10201ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown android.R.id.text1, 10301ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown popupItems); 10401ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown lv.setAdapter(adapter); 10501ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown 10601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // Create a RespondViaSmsItemClickListener instance to handle item 10701ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // clicks from the popup. 1089e25b785cc7edae682144536f58080edb3a374e4David Brown // (Note we create a fresh instance for each incoming call, and 1099e25b785cc7edae682144536f58080edb3a374e4David Brown // stash away the call's phone number, since we can't necessarily 1109e25b785cc7edae682144536f58080edb3a374e4David Brown // assume this call will still be ringing when the user finally 11101ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // chooses a response.) 1129e25b785cc7edae682144536f58080edb3a374e4David Brown 1139e25b785cc7edae682144536f58080edb3a374e4David Brown Connection c = ringingCall.getLatestConnection(); 1149e25b785cc7edae682144536f58080edb3a374e4David Brown if (DBG) log("- connection: " + c); 1159e25b785cc7edae682144536f58080edb3a374e4David Brown 1169e25b785cc7edae682144536f58080edb3a374e4David Brown // TODO: at this point we probably should re-check c.getAddress() 1179e25b785cc7edae682144536f58080edb3a374e4David Brown // and c.getNumberPresentation() for validity. (i.e. recheck the 1189e25b785cc7edae682144536f58080edb3a374e4David Brown // same cases in InCallTouchUi.showIncomingCallWidget() where we 1199e25b785cc7edae682144536f58080edb3a374e4David Brown // should have disallowed the "respond via SMS" feature in the 1209e25b785cc7edae682144536f58080edb3a374e4David Brown // first place.) 1219e25b785cc7edae682144536f58080edb3a374e4David Brown 1229e25b785cc7edae682144536f58080edb3a374e4David Brown String phoneNumber = c.getAddress(); 12301ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown if (DBG) log("- phoneNumber: " + phoneNumber); // STOPSHIP: don't log PII 124524486403a387c324dee5aff7fb78ca784d15255David Brown lv.setOnItemClickListener(new RespondViaSmsItemClickListener(phoneNumber)); 12511544975bb29ede282333209e945a75430b221a8David Brown 126524486403a387c324dee5aff7fb78ca784d15255David Brown AlertDialog.Builder builder = new AlertDialog.Builder(mInCallScreen) 12701ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown .setCancelable(true) 128524486403a387c324dee5aff7fb78ca784d15255David Brown .setOnCancelListener(new RespondViaSmsCancelListener()) 12901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown .setView(lv); 130524486403a387c324dee5aff7fb78ca784d15255David Brown mPopup = builder.create(); 131524486403a387c324dee5aff7fb78ca784d15255David Brown mPopup.show(); 132524486403a387c324dee5aff7fb78ca784d15255David Brown } 1339e25b785cc7edae682144536f58080edb3a374e4David Brown 134524486403a387c324dee5aff7fb78ca784d15255David Brown /** 135524486403a387c324dee5aff7fb78ca784d15255David Brown * Dismiss the "Respond via SMS" popup if it's visible. 136524486403a387c324dee5aff7fb78ca784d15255David Brown * 137524486403a387c324dee5aff7fb78ca784d15255David Brown * This is safe to call even if the popup is already dismissed, and 138524486403a387c324dee5aff7fb78ca784d15255David Brown * even if you never called showRespondViaSmsPopup() in the first 139524486403a387c324dee5aff7fb78ca784d15255David Brown * place. 140524486403a387c324dee5aff7fb78ca784d15255David Brown */ 141524486403a387c324dee5aff7fb78ca784d15255David Brown public void dismissPopup() { 142524486403a387c324dee5aff7fb78ca784d15255David Brown if (mPopup != null) { 143524486403a387c324dee5aff7fb78ca784d15255David Brown mPopup.dismiss(); // safe even if already dismissed 144524486403a387c324dee5aff7fb78ca784d15255David Brown mPopup = null; 145524486403a387c324dee5aff7fb78ca784d15255David Brown } 1469e25b785cc7edae682144536f58080edb3a374e4David Brown } 1479e25b785cc7edae682144536f58080edb3a374e4David Brown 1489e25b785cc7edae682144536f58080edb3a374e4David Brown /** 14901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown * OnItemClickListener for the "Respond via SMS" popup. 1509e25b785cc7edae682144536f58080edb3a374e4David Brown */ 151524486403a387c324dee5aff7fb78ca784d15255David Brown public class RespondViaSmsItemClickListener implements AdapterView.OnItemClickListener { 1529e25b785cc7edae682144536f58080edb3a374e4David Brown // Phone number to send the SMS to. 1539e25b785cc7edae682144536f58080edb3a374e4David Brown private String mPhoneNumber; 1549e25b785cc7edae682144536f58080edb3a374e4David Brown 155524486403a387c324dee5aff7fb78ca784d15255David Brown public RespondViaSmsItemClickListener(String phoneNumber) { 1569e25b785cc7edae682144536f58080edb3a374e4David Brown mPhoneNumber = phoneNumber; 1579e25b785cc7edae682144536f58080edb3a374e4David Brown } 1589e25b785cc7edae682144536f58080edb3a374e4David Brown 15911544975bb29ede282333209e945a75430b221a8David Brown /** 16011544975bb29ede282333209e945a75430b221a8David Brown * Handles the user selecting an item from the popup. 16111544975bb29ede282333209e945a75430b221a8David Brown */ 16201ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown public void onItemClick(AdapterView<?> parent, // The ListView 16301ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown View view, // The TextView that was clicked 16401ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown int position, 16501ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown long id) { 16601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown if (DBG) log("RespondViaSmsItemClickListener.onItemClick(" + position + ")..."); 16701ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown String message = (String) parent.getItemAtPosition(position); 16801ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown if (DBG) log("- message: '" + message + "'"); 16901ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown 17001ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // The "Custom" choice is a special case. 17101ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // (For now, it's guaranteed to be the last item.) 17201ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown if (position == (parent.getCount() - 1)) { 1739e25b785cc7edae682144536f58080edb3a374e4David Brown // Take the user to the standard SMS compose UI. 174524486403a387c324dee5aff7fb78ca784d15255David Brown launchSmsCompose(mPhoneNumber); 1759e25b785cc7edae682144536f58080edb3a374e4David Brown } else { 17601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // Send the selected message immediately with no user interaction. 177524486403a387c324dee5aff7fb78ca784d15255David Brown sendText(mPhoneNumber, message); 1789e25b785cc7edae682144536f58080edb3a374e4David Brown } 1799e25b785cc7edae682144536f58080edb3a374e4David Brown 1809e25b785cc7edae682144536f58080edb3a374e4David Brown PhoneApp.getInstance().dismissCallScreen(); 1819e25b785cc7edae682144536f58080edb3a374e4David Brown } 1829e25b785cc7edae682144536f58080edb3a374e4David Brown } 1839e25b785cc7edae682144536f58080edb3a374e4David Brown 1849e25b785cc7edae682144536f58080edb3a374e4David Brown /** 18501ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown * OnCancelListener for the "Respond via SMS" popup. 18611544975bb29ede282333209e945a75430b221a8David Brown */ 187524486403a387c324dee5aff7fb78ca784d15255David Brown public class RespondViaSmsCancelListener implements DialogInterface.OnCancelListener { 188524486403a387c324dee5aff7fb78ca784d15255David Brown public RespondViaSmsCancelListener() { 18911544975bb29ede282333209e945a75430b221a8David Brown } 19011544975bb29ede282333209e945a75430b221a8David Brown 19111544975bb29ede282333209e945a75430b221a8David Brown /** 19201ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown * Handles the user canceling the popup, either by touching 19311544975bb29ede282333209e945a75430b221a8David Brown * outside the popup or by pressing Back. 19411544975bb29ede282333209e945a75430b221a8David Brown */ 19501ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown public void onCancel(DialogInterface dialog) { 19601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown if (DBG) log("RespondViaSmsCancelListener.onCancel()..."); 19711544975bb29ede282333209e945a75430b221a8David Brown 19801ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown // If the user cancels the popup, this presumably means that 19911544975bb29ede282333209e945a75430b221a8David Brown // they didn't actually mean to bring up the "Respond via SMS" 20011544975bb29ede282333209e945a75430b221a8David Brown // UI in the first place (and instead want to go back to the 20111544975bb29ede282333209e945a75430b221a8David Brown // state where they can either answer or reject the call.) 20211544975bb29ede282333209e945a75430b221a8David Brown // So restart the ringer and bring back the regular incoming 20311544975bb29ede282333209e945a75430b221a8David Brown // call UI. 20411544975bb29ede282333209e945a75430b221a8David Brown 20511544975bb29ede282333209e945a75430b221a8David Brown // This will have no effect if the incoming call isn't still ringing. 20601ad18615f81d3f75ec4eb7f9b7943ef9521d7c1David Brown PhoneApp.getInstance().notifier.restartRinger(); 20711544975bb29ede282333209e945a75430b221a8David Brown 20811544975bb29ede282333209e945a75430b221a8David Brown // We hid the MultiWaveView widget way back in 20911544975bb29ede282333209e945a75430b221a8David Brown // InCallTouchUi.onTrigger(), when the user first selected 21011544975bb29ede282333209e945a75430b221a8David Brown // the "SMS" trigger. 21111544975bb29ede282333209e945a75430b221a8David Brown // 21211544975bb29ede282333209e945a75430b221a8David Brown // To bring it back, just force the entire InCallScreen to 21311544975bb29ede282333209e945a75430b221a8David Brown // update itself based on the current telephony state. 21411544975bb29ede282333209e945a75430b221a8David Brown // (Assuming the incoming call is still ringing, this will 21511544975bb29ede282333209e945a75430b221a8David Brown // cause the incoming call widget to reappear.) 21611544975bb29ede282333209e945a75430b221a8David Brown mInCallScreen.requestUpdateScreen(); 21711544975bb29ede282333209e945a75430b221a8David Brown } 21811544975bb29ede282333209e945a75430b221a8David Brown } 21911544975bb29ede282333209e945a75430b221a8David Brown 22011544975bb29ede282333209e945a75430b221a8David Brown /** 2219e25b785cc7edae682144536f58080edb3a374e4David Brown * Sends a text message without any interaction from the user. 2229e25b785cc7edae682144536f58080edb3a374e4David Brown */ 223524486403a387c324dee5aff7fb78ca784d15255David Brown private void sendText(String phoneNumber, String message) { 2249e25b785cc7edae682144536f58080edb3a374e4David Brown // STOPSHIP: disable all logging of PII (everywhere in this file) 2259e25b785cc7edae682144536f58080edb3a374e4David Brown if (DBG) log("sendText: number " 2269e25b785cc7edae682144536f58080edb3a374e4David Brown + phoneNumber + ", message '" + message + "'"); 2279e25b785cc7edae682144536f58080edb3a374e4David Brown 2289e25b785cc7edae682144536f58080edb3a374e4David Brown // TODO: This code should use the new 2299e25b785cc7edae682144536f58080edb3a374e4David Brown // com.android.mms.intent.action.SENDTO_NO_CONFIRMATION 2309e25b785cc7edae682144536f58080edb3a374e4David Brown // intent once change https://android-git.corp.google.com/g/114664 2319e25b785cc7edae682144536f58080edb3a374e4David Brown // gets checked in. 2329e25b785cc7edae682144536f58080edb3a374e4David Brown // But use the old-school SmsManager API for now. 2339e25b785cc7edae682144536f58080edb3a374e4David Brown 2349e25b785cc7edae682144536f58080edb3a374e4David Brown final SmsManager smsManager = SmsManager.getDefault(); 2359e25b785cc7edae682144536f58080edb3a374e4David Brown smsManager.sendTextMessage(phoneNumber, 2369e25b785cc7edae682144536f58080edb3a374e4David Brown null /* scAddress; null means "use default" */, 2379e25b785cc7edae682144536f58080edb3a374e4David Brown message, 2389e25b785cc7edae682144536f58080edb3a374e4David Brown null /* sentIntent */, 2399e25b785cc7edae682144536f58080edb3a374e4David Brown null /* deliveryIntent */); 2409e25b785cc7edae682144536f58080edb3a374e4David Brown } 2419e25b785cc7edae682144536f58080edb3a374e4David Brown 2429e25b785cc7edae682144536f58080edb3a374e4David Brown /** 2439e25b785cc7edae682144536f58080edb3a374e4David Brown * Brings up the standard SMS compose UI. 2449e25b785cc7edae682144536f58080edb3a374e4David Brown */ 245524486403a387c324dee5aff7fb78ca784d15255David Brown private void launchSmsCompose(String phoneNumber) { 2469e25b785cc7edae682144536f58080edb3a374e4David Brown if (DBG) log("launchSmsCompose: number " + phoneNumber); 2479e25b785cc7edae682144536f58080edb3a374e4David Brown 2489e25b785cc7edae682144536f58080edb3a374e4David Brown // TODO: confirm with SMS guys that this is the correct intent to use. 24965454c803eb305c4740885ad4995a871b034a58aDavid Brown Uri uri = Uri.fromParts(Constants.SCHEME_SMS, phoneNumber, null); 2509e25b785cc7edae682144536f58080edb3a374e4David Brown Intent intent = new Intent(Intent.ACTION_VIEW, uri); 2519e25b785cc7edae682144536f58080edb3a374e4David Brown 2529e25b785cc7edae682144536f58080edb3a374e4David Brown if (DBG) log("- Launching SMS compose UI: " + intent); 253524486403a387c324dee5aff7fb78ca784d15255David Brown mInCallScreen.startActivity(intent); 2549e25b785cc7edae682144536f58080edb3a374e4David Brown 2559e25b785cc7edae682144536f58080edb3a374e4David Brown // TODO: One open issue here: if the user selects "Custom message" 2569e25b785cc7edae682144536f58080edb3a374e4David Brown // for an incoming call while the device was locked, and the user 2579e25b785cc7edae682144536f58080edb3a374e4David Brown // does *not* have a secure keyguard set, we bring up the 2589e25b785cc7edae682144536f58080edb3a374e4David Brown // non-secure keyguard at this point :-( 2599e25b785cc7edae682144536f58080edb3a374e4David Brown // Instead, we should immediately go to the SMS compose UI. 2609e25b785cc7edae682144536f58080edb3a374e4David Brown // 2619e25b785cc7edae682144536f58080edb3a374e4David Brown // I *believe* the fix is for the SMS compose activity to set the 2629e25b785cc7edae682144536f58080edb3a374e4David Brown // FLAG_DISMISS_KEYGUARD window flag (which will cause the 2639e25b785cc7edae682144536f58080edb3a374e4David Brown // keyguard to be dismissed *only* if it is not a secure lock 2649e25b785cc7edae682144536f58080edb3a374e4David Brown // keyguard.) 2659e25b785cc7edae682144536f58080edb3a374e4David Brown // 2669e25b785cc7edae682144536f58080edb3a374e4David Brown // But it there an equivalent way for me to accomplish that here, 2679e25b785cc7edae682144536f58080edb3a374e4David Brown // without needing to change the SMS app? 2689e25b785cc7edae682144536f58080edb3a374e4David Brown // 2699e25b785cc7edae682144536f58080edb3a374e4David Brown // In any case, I'm pretty sure the SMS UI should *not* to set 2709e25b785cc7edae682144536f58080edb3a374e4David Brown // FLAG_SHOW_WHEN_LOCKED, since we do want the force the user to 2719e25b785cc7edae682144536f58080edb3a374e4David Brown // enter their lock pattern or PIN at this point if they have a 2729e25b785cc7edae682144536f58080edb3a374e4David Brown // secure keyguard set. 2739e25b785cc7edae682144536f58080edb3a374e4David Brown } 2749e25b785cc7edae682144536f58080edb3a374e4David Brown 275524486403a387c324dee5aff7fb78ca784d15255David Brown private void log(String msg) { 2769e25b785cc7edae682144536f58080edb3a374e4David Brown Log.d(TAG, msg); 2779e25b785cc7edae682144536f58080edb3a374e4David Brown } 2789e25b785cc7edae682144536f58080edb3a374e4David Brown} 279