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