194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/*
294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Copyright (C) 2011 The Android Open Source Project
394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng *
494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License");
594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * you may not use this file except in compliance with the License.
694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * You may obtain a copy of the License at
794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng *
894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng *      http://www.apache.org/licenses/LICENSE-2.0
994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng *
1094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Unless required by applicable law or agreed to in writing, software
1194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS,
1294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * See the License for the specific language governing permissions and
1494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * limitations under the License.
1594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */
1694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
1794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpackage com.android.dialer.tests.calllog;
1894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
1994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.Activity;
20ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.app.DatePickerDialog;
21ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.app.Dialog;
22ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.app.DialogFragment;
2394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.LoaderManager;
24ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.app.TimePickerDialog;
2594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentProviderClient;
26326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Leeimport android.content.ContentResolver;
2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentValues;
2816b68491261362737752e6babc95f89e2b468f49Jay Shraunerimport android.content.Context;
2994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.CursorLoader;
3094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.Loader;
3194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.database.Cursor;
32326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Leeimport android.net.Uri;
3394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.AsyncTask;
3494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.Bundle;
3594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.RemoteException;
3694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.CallLog.Calls;
37326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Leeimport android.provider.VoicemailContract;
38326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Leeimport android.provider.VoicemailContract.Status;
39326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Leeimport android.provider.VoicemailContract.Voicemails;
4016b68491261362737752e6babc95f89e2b468f49Jay Shraunerimport android.telecom.PhoneAccount;
419dc924c8bcc0bc8d996452e9ce3215b5f064962eTyler Gunnimport android.telecom.PhoneAccountHandle;
4226e2ae950debe64389564c7c88911adae3bcf47aAndrew Leeimport android.text.Editable;
4326e2ae950debe64389564c7c88911adae3bcf47aAndrew Leeimport android.text.TextWatcher;
44ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.text.format.DateFormat;
4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.util.Log;
46c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Leeimport android.view.MotionEvent;
4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View;
4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Button;
4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.CheckBox;
50ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.DatePicker;
51838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunnimport android.widget.EditText;
5294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.ProgressBar;
53ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.RadioButton;
5494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.TextView;
55ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.TimePicker;
5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Toast;
5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
58fdb93b7079d522d688ec0ebe58c92d45aee48786Nancy Chenimport com.android.contacts.common.compat.telecom.TelecomManagerCompat;
5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport com.android.dialer.tests.R;
60838988bf34229b33ed39bb7dc7109427da264c81Andrew Leeimport com.android.dialer.util.AppCompatConstants;
61fdb93b7079d522d688ec0ebe58c92d45aee48786Nancy Chenimport com.android.dialer.util.TelecomUtil;
6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
63ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport java.util.Calendar;
6487ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chenimport java.util.List;
6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.Random;
6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/**
6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Activity to add entries to the call log for testing.
6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */
7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class FillCallLogTestActivity extends Activity {
7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final String TAG = "FillCallLogTestActivity";
7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Identifier of the loader for querying the call log. */
7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int CALLLOG_LOADER_ID = 1;
7494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
7594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final Random RNG = new Random();
7694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int[] CALL_TYPES = new int[] {
77838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        AppCompatConstants.CALLS_INCOMING_TYPE,
78838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        AppCompatConstants.CALLS_OUTGOING_TYPE,
79838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        AppCompatConstants.CALLS_MISSED_TYPE
8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    };
8194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private TextView mNumberTextView;
8394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private Button mAddButton;
8494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ProgressBar mProgressBar;
8594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private CheckBox mUseRandomNumbers;
86ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeIncoming;
87ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeMissed;
88ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeOutgoing;
89326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    private RadioButton mCallTypeVoicemail;
90c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee    private RadioButton mCallTypeCustom;
91c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee    private EditText mCustomCallTypeTextView;
928b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn    private CheckBox mCallTypeVideo;
93ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationAllowed;
94ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationRestricted;
95ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationUnknown;
96ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationPayphone;
97ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mCallDate;
98ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mCallTime;
99ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mPhoneNumber;
100838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn    private EditText mOffset;
101ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
102ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallTimeHour;
103ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallTimeMinute;
104ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateYear;
105ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateMonth;
106ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateDay;
1071d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad    private RadioButton mAccount0;
1081d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad    private RadioButton mAccount1;
10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    @Override
11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    protected void onCreate(Bundle savedInstanceState) {
11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        super.onCreate(savedInstanceState);
11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        setContentView(R.layout.fill_call_log_test);
11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView = (TextView) findViewById(R.id.number);
11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton = (Button) findViewById(R.id.add);
11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar = (ProgressBar) findViewById(R.id.progress);
11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mUseRandomNumbers = (CheckBox) findViewById(R.id.use_random_numbers);
11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setOnClickListener(new View.OnClickListener(){
12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            @Override
12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            public void onClick(View v) {
12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                int count;
12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    count = Integer.parseInt(mNumberTextView.getText().toString());
12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (count > 100) {
12694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        throw new RuntimeException("Number too large.  Max=100");
12794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
12894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RuntimeException e) {
12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Toast.makeText(FillCallLogTestActivity.this, e.toString(), Toast.LENGTH_LONG)
13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                            .show();
13194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
13294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                addEntriesToCallLog(count, mUseRandomNumbers.isChecked());
13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mNumberTextView.setEnabled(false);
13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mAddButton.setEnabled(false);
13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setProgress(0);
13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setMax(count);
13894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setVisibility(View.VISIBLE);
13994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
14094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        });
141ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
142ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeIncoming = (RadioButton) findViewById(R.id.call_type_incoming);
143ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeMissed = (RadioButton) findViewById(R.id.call_type_missed);
144ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeOutgoing = (RadioButton) findViewById(R.id.call_type_outgoing);
145326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        mCallTypeVoicemail = (RadioButton) findViewById(R.id.call_type_voicemail);
146c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        mCallTypeCustom = (RadioButton) findViewById(R.id.call_type_custom);
147c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        mCustomCallTypeTextView = (EditText) findViewById(R.id.call_type_custom_text);
1488b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        mCallTypeVideo = (CheckBox) findViewById(R.id.call_type_video);
149ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationAllowed = (RadioButton) findViewById(R.id.presentation_allowed);
150ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationPayphone = (RadioButton) findViewById(R.id.presentation_payphone);
151ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationUnknown = (RadioButton) findViewById(R.id.presentation_unknown);
152ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationRestricted = (RadioButton) findViewById(R.id.presentation_restricted);
153ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTime = (TextView) findViewById(R.id.call_time);
154ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDate = (TextView) findViewById(R.id.call_date);
155ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPhoneNumber = (TextView) findViewById(R.id.phone_number);
156838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mOffset = (EditText) findViewById(R.id.delta_after_add);
1571d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        mAccount0 = (RadioButton) findViewById(R.id.account0);
1581d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        mAccount1 = (RadioButton) findViewById(R.id.account1);
159ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
16026e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee        mCustomCallTypeTextView.addTextChangedListener(new TextWatcher() {
161c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            @Override
16226e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
16326e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee                // Do nothing.
16426e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            }
16526e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee
16626e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            @Override
16726e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            public void onTextChanged(CharSequence s, int start, int before, int count) {
16826e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee                // Toggle the custom call type radio button if the text is changed/focused.
169c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee                mCallTypeCustom.toggle();
17026e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            }
17126e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee
17226e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            @Override
17326e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee            public void afterTextChanged(Editable s) {
17426e2ae950debe64389564c7c88911adae3bcf47aAndrew Lee                // Do nothing.
175c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            }
176c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        });
177c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee
178ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        // Use the current time as the default values for the picker
179ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        final Calendar c = Calendar.getInstance();
180ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTimeHour = c.get(Calendar.HOUR_OF_DAY);
181ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTimeMinute = c.get(Calendar.MINUTE);
182ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateYear = c.get(Calendar.YEAR);
183ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateMonth = c.get(Calendar.MONTH);
184ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateDay = c.get(Calendar.DAY_OF_MONTH);
185ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        setDisplayDate();
186ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        setDisplayTime();
18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Adds a number of entries to the call log. The content of the entries is based on existing
19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * entries.
19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries to add
19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addEntriesToCallLog(final int count, boolean useRandomNumbers) {
19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        if (useRandomNumbers) {
19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            addRandomNumbers(count);
19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        } else {
19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            getLoaderManager().initLoader(CALLLOG_LOADER_ID, null,
20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    new CallLogLoaderListener(count));
20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Calls when the insertion has completed.
20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param message the message to show in a toast to the user
20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void insertCompleted(String message) {
21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Hide the progress bar.
21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setVisibility(View.GONE);
21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Re-enable the add button.
21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setEnabled(true);
21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setEnabled(true);
21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setText("");
21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
22094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Creates a {@link ContentValues} object containing values corresponding to the given cursor.
22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param cursor the cursor from which to get the values
22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @return a newly created content values object
22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ContentValues createContentValuesFromCursor(Cursor cursor) {
22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues values = new ContentValues();
22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int column = 0; column < cursor.getColumnCount();
22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ++column) {
23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            String name = cursor.getColumnName(column);
23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            switch (cursor.getType(column)) {
23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_STRING:
23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getString(column));
23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_INTEGER:
23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getLong(column));
23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_FLOAT:
23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getDouble(column));
24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_BLOB:
24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getBlob(column));
24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_NULL:
24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.putNull(name);
24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
24794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                default:
24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "Invalid value in cursor: " + cursor.getType(column));
24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return values;
25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addRandomNumbers(int count) {
25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues[] values = new ContentValues[count];
25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int i = 0; i < count; i++) {
25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i] = new ContentValues();
25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.NUMBER, generateRandomNumber());
260719a7adde25e0a717816b00668c16c3a1e3c5518Jay Shrauner            values[i].put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_ALLOWED);
26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DATE, System.currentTimeMillis()); // Will be randomized later
26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DURATION, 1); // Will be overwritten later
26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        new AsyncCallLogInserter(values).execute(new Void[0]);
26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static String generateRandomNumber() {
26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return String.format("5%09d", RNG.nextInt(1000000000));
26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Invokes {@link AsyncCallLogInserter} when the call log has loaded. */
27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class CallLogLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
27394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert when done. */
27494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final int mCount;
27594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private CallLogLoaderListener(int count) {
27794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mCount = count;
27894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
27994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
28194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
28294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onCreateLoader");
28394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return new CursorLoader(FillCallLogTestActivity.this, Calls.CONTENT_URI,
28494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    null, null, null, null);
28594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
28694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
28894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
28994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            try {
29094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                Log.d(TAG, "onLoadFinished");
29194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
29294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (data.getCount() == 0) {
29394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    // If there are no entries in the call log, we cannot generate new ones.
29494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    insertCompleted(getString(R.string.noLogEntriesToast));
29594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
29694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
29794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
29894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                data.moveToPosition(-1);
29994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
30094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues[] values = new ContentValues[mCount];
30194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                for (int index = 0; index < mCount; ++index) {
30294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (!data.moveToNext()) {
30394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        data.moveToFirst();
30494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
30594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values[index] = createContentValuesFromCursor(data);
30694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
30794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                new AsyncCallLogInserter(values).execute(new Void[0]);
30894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            } finally {
30994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // This is a one shot loader.
31094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                getLoaderManager().destroyLoader(CALLLOG_LOADER_ID);
31194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
31294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
31394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
31494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
31594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoaderReset(Loader<Cursor> loader) {}
31694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
31794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
31894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Inserts a given number of entries in the call log based on the values given. */
31994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class AsyncCallLogInserter extends AsyncTask<Void, Integer, Integer> {
32094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert. */
32194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final ContentValues[] mValues;
32294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
32394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public AsyncCallLogInserter(ContentValues[] values) {
32494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mValues = values;
32594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
32694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
32794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
32894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected Integer doInBackground(Void... params) {
32994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "doInBackground");
33094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return insertIntoCallLog();
33194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
33294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
33394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
33494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onProgressUpdate(Integer... values) {
33594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onProgressUpdate");
33694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            updateCount(values[0]);
33794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
33894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
33994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
34094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onPostExecute(Integer count) {
34194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onPostExecute");
34294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            insertCompleted(getString(R.string.addedLogEntriesToast, count));
34394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
34494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
34594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /**
34694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * Inserts a number of entries in the call log based on the given templates.
34794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         *
34894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * @return the number of inserted entries
34994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         */
35094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private Integer insertIntoCallLog() {
35194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int inserted = 0;
35294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
35394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            for (int index = 0; index < mValues.length; ++index) {
35494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues values = mValues[index];
35594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // These should not be set.
35694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls._ID);
35794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the date. For each new entry being added, add an extra
35894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // day to the maximum possible offset from the original.
35994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.DATE,
36094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        values.getAsLong(Calls.DATE)
36194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        - RNG.nextInt(24 * 60 * 60 * (index + 1)) * 1000L);
36294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the duration.
36394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (values.getAsLong(Calls.DURATION) > 0) {
36494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(Calls.DURATION, RNG.nextInt(30 * 60 * 60 * 1000));
36594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
36694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
36794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Overwrite type.
36894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.TYPE, CALL_TYPES[RNG.nextInt(CALL_TYPES.length)]);
36994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
37094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Clear cached columns.
37194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_FORMATTED_NUMBER);
37294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_LOOKUP_URI);
37394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_MATCHED_NUMBER);
37494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NAME);
37594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NORMALIZED_NUMBER);
37694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_LABEL);
37794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_TYPE);
37894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_PHOTO_ID);
37994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
38094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Insert into the call log the newly generated entry.
38194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentProviderClient contentProvider =
38294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        getContentResolver().acquireContentProviderClient(
38394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                                Calls.CONTENT_URI);
38494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
38594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "adding entry to call log");
38694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    contentProvider.insert(Calls.CONTENT_URI, values);
38794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    ++inserted;
38894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    this.publishProgress(inserted);
38994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RemoteException e) {
39094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "insert failed", e);
39194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
39294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
39394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return inserted;
39494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
39594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
39694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
39794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
39894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Updates the count shown to the user corresponding to the number of entries added.
39994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
40094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries inserted so far
40194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
40294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void updateCount(Integer count) {
40394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setProgress(count);
40494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
405ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
406ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
407ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Determines the call type for a manually entered call.
408ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
409ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @return Call type.
410ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
411ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int getManualCallType() {
412ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        if (mCallTypeIncoming.isChecked()) {
413838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_INCOMING_TYPE;
414ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mCallTypeOutgoing.isChecked()) {
415838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_OUTGOING_TYPE;
416326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        } else if (mCallTypeVoicemail.isChecked()) {
417838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_VOICEMAIL_TYPE;
418c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        } else if (mCallTypeCustom.isChecked()) {
419c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            return Integer.parseInt(mCustomCallTypeTextView.getText().toString());
420ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else {
421838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_MISSED_TYPE;
422ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
423ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
424ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
425ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
426ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Determines the presentation for a manually entered call.
427ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
428ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @return Presentation.
429ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
430ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int getManualPresentation() {
431ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        if (mPresentationAllowed.isChecked()) {
432ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_ALLOWED;
433ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mPresentationPayphone.isChecked()) {
434ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_PAYPHONE;
435ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mPresentationRestricted.isChecked()) {
436ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_RESTRICTED;
437ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else {
438ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_UNKNOWN;
439ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
440ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
441ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
442c329bfb6d47f20237d22e13297d5bbb72e612919Evan Charlton    private PhoneAccountHandle getManualAccount() {
443fdb93b7079d522d688ec0ebe58c92d45aee48786Nancy Chen        List <PhoneAccountHandle> accountHandles = TelecomUtil.getCallCapablePhoneAccounts(this);
444fdb93b7079d522d688ec0ebe58c92d45aee48786Nancy Chen        //TODO: hide the corresponding radio buttons if no accounts are available.
4451d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        if (mAccount0.isChecked()) {
446a2eadf3d68d4f6d0a948d37bc48e930115723ce0Evan Charlton            return accountHandles.get(0);
4471d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        } else if (mAccount1.isChecked()){
448a2eadf3d68d4f6d0a948d37bc48e930115723ce0Evan Charlton            return accountHandles.get(1);
44987ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        } else {
45087ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen            return null;
45187ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        }
45287ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen    }
45387ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen
454ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
455ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Shows a time picker dialog, storing the results in the time field.
456ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
457ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void showTimePickerDialog(View v) {
458ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        DialogFragment newFragment = new TimePickerFragment();
459ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        newFragment.show(getFragmentManager(),"timePicker");
460ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
461ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
462ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
463ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Helper class to display time picker and store the hour/minute.
464ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
465ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public class TimePickerFragment extends DialogFragment
466ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            implements TimePickerDialog.OnTimeSetListener {
467ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
468ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        @Override
469ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public Dialog onCreateDialog(Bundle savedInstanceState) {
470ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            // Create a new instance of TimePickerDialog and return it
471ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return new TimePickerDialog(getActivity(), this, mCallTimeHour, mCallTimeMinute,
472ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                    DateFormat.is24HourFormat(getActivity()));
473ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
474ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
475ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
476ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallTimeHour = hourOfDay;
477ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallTimeMinute = minute;
478ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            setDisplayTime();
479ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
480ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
481ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
482ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
483ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Sets the call time TextView to the current selected time.
484ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
485ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private void setDisplayTime() {
486ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTime.setText(String.format("%02d:%02d", mCallTimeHour, mCallTimeMinute));
487ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
488ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
489ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
490ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Sets the call date Textview to the current selected date
491ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
492ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private void setDisplayDate() {
493ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDate.setText(String.format("%04d-%02d-%02d", mCallDateYear, mCallDateMonth,
494ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                mCallDateDay));
495ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
496ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
497ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
498ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Shows a date picker dialog.
499ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
500ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void showDatePickerDialog(View v) {
501ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        DialogFragment newFragment = new DatePickerFragment();
502ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        newFragment.show(getFragmentManager(),"datePicker");
503ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
504ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
505ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
506ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Helper class to show a date picker.
507ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
508ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public class DatePickerFragment extends DialogFragment
509ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            implements DatePickerDialog.OnDateSetListener {
510ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
511ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        @Override
512ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public Dialog onCreateDialog(Bundle savedInstanceState) {
513ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            // Create a new instance of DatePickerDialog and return it
514ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return new DatePickerDialog(getActivity(), this, mCallDateYear, mCallDateMonth,
515ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                    mCallDateDay);
516ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
517ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
518ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public void onDateSet(DatePicker view, int year, int month, int day) {
519ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateYear = year;
520ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateMonth = month;
521ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateDay = day;
522ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            setDisplayDate();
523ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
524ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
525ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
526ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
527ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * OnClick handler for the button that adds a manual call log entry to the call log.
528ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
529ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @param v Calling view.
530ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
531ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void addManualEntry(View v) {
532ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        Calendar dateTime = Calendar.getInstance();
533ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        dateTime.set(mCallDateYear, mCallDateMonth, mCallDateDay, mCallTimeHour, mCallTimeMinute);
534ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
53503610993bf2adf12a6962c32851095551ffd0043Yorke Lee        int features = mCallTypeVideo.isChecked() ? Calls.FEATURES_VIDEO : 0;
5368b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        Long dataUsage = null;
5378b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        if (mCallTypeVideo.isChecked()) {
5388b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn            // Some random data usage up to 50MB.
5398b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn            dataUsage = (long) RNG.nextInt(52428800);
5408b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        }
5418b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn
542838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        if (getManualCallType() == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
543326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee            addManualVoicemail(dateTime.getTimeInMillis());
544326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        } else {
54516b68491261362737752e6babc95f89e2b468f49Jay Shrauner            addCall(mPhoneNumber.getText().toString(), getManualPresentation(),
546326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                    getManualCallType(), features, getManualAccount(),
547326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                    dateTime.getTimeInMillis(), RNG.nextInt(60 * 60), dataUsage);
548326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        }
549ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
550838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        // Subtract offset from the call date/time and store as new date/time
551838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        int offset = Integer.parseInt(mOffset.getText().toString());
552838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn
553838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        dateTime.add(Calendar.MINUTE, offset);
554838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateYear = dateTime.get(Calendar.YEAR);
555838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateMonth = dateTime.get(Calendar.MONTH);
556838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateDay = dateTime.get(Calendar.DAY_OF_MONTH);
557838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallTimeHour = dateTime.get(Calendar.HOUR_OF_DAY);
558838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallTimeMinute = dateTime.get(Calendar.MINUTE);
559838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        setDisplayDate();
560838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        setDisplayTime();
561ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
562326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
56316b68491261362737752e6babc95f89e2b468f49Jay Shrauner    // Copied and modified to compile unbundled from android.provider.CallLog
56416b68491261362737752e6babc95f89e2b468f49Jay Shrauner    public Uri addCall(String number,
56516b68491261362737752e6babc95f89e2b468f49Jay Shrauner            int presentation, int callType, int features, PhoneAccountHandle accountHandle,
56616b68491261362737752e6babc95f89e2b468f49Jay Shrauner            long start, int duration, Long dataUsage) {
56716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        final ContentResolver resolver = getContentResolver();
56816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        int numberPresentation = Calls.PRESENTATION_ALLOWED;
56916b68491261362737752e6babc95f89e2b468f49Jay Shrauner
57016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        String accountAddress = null;
571fdb93b7079d522d688ec0ebe58c92d45aee48786Nancy Chen        if (accountHandle != null) {
572fdb93b7079d522d688ec0ebe58c92d45aee48786Nancy Chen            PhoneAccount account = TelecomUtil.getPhoneAccount(this, accountHandle);
57316b68491261362737752e6babc95f89e2b468f49Jay Shrauner            if (account != null) {
57416b68491261362737752e6babc95f89e2b468f49Jay Shrauner                Uri address = account.getSubscriptionAddress();
57516b68491261362737752e6babc95f89e2b468f49Jay Shrauner                if (address != null) {
57616b68491261362737752e6babc95f89e2b468f49Jay Shrauner                    accountAddress = address.getSchemeSpecificPart();
57716b68491261362737752e6babc95f89e2b468f49Jay Shrauner                }
57816b68491261362737752e6babc95f89e2b468f49Jay Shrauner            }
57916b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
58016b68491261362737752e6babc95f89e2b468f49Jay Shrauner
58116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (numberPresentation != Calls.PRESENTATION_ALLOWED) {
58216b68491261362737752e6babc95f89e2b468f49Jay Shrauner            number = "";
58316b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
58416b68491261362737752e6babc95f89e2b468f49Jay Shrauner
58516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        // accountHandle information
58616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        String accountComponentString = null;
58716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        String accountId = null;
58816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (accountHandle != null) {
58916b68491261362737752e6babc95f89e2b468f49Jay Shrauner            accountComponentString = accountHandle.getComponentName().flattenToString();
59016b68491261362737752e6babc95f89e2b468f49Jay Shrauner            accountId = accountHandle.getId();
59116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
59216b68491261362737752e6babc95f89e2b468f49Jay Shrauner
59316b68491261362737752e6babc95f89e2b468f49Jay Shrauner        ContentValues values = new ContentValues(6);
59416b68491261362737752e6babc95f89e2b468f49Jay Shrauner
59516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.NUMBER, number);
59616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.NUMBER_PRESENTATION, Integer.valueOf(numberPresentation));
59716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.TYPE, Integer.valueOf(callType));
59816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.FEATURES, features);
59916b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.DATE, Long.valueOf(start));
60016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.DURATION, Long.valueOf(duration));
60116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (dataUsage != null) {
60216b68491261362737752e6babc95f89e2b468f49Jay Shrauner            values.put(Calls.DATA_USAGE, dataUsage);
60316b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
60416b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.PHONE_ACCOUNT_COMPONENT_NAME, accountComponentString);
60516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.PHONE_ACCOUNT_ID, accountId);
60616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        // Calls.PHONE_ACCOUNT_ADDRESS
60716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put("phone_account_address", accountAddress);
60816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.NEW, Integer.valueOf(1));
60916b68491261362737752e6babc95f89e2b468f49Jay Shrauner
610838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        if (callType == AppCompatConstants.CALLS_MISSED_TYPE) {
61116b68491261362737752e6babc95f89e2b468f49Jay Shrauner            values.put(Calls.IS_READ, 0);
61216b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
61316b68491261362737752e6babc95f89e2b468f49Jay Shrauner
61416b68491261362737752e6babc95f89e2b468f49Jay Shrauner        return addEntryAndRemoveExpiredEntries(this, Calls.CONTENT_URI, values);
61516b68491261362737752e6babc95f89e2b468f49Jay Shrauner    }
61616b68491261362737752e6babc95f89e2b468f49Jay Shrauner
61716b68491261362737752e6babc95f89e2b468f49Jay Shrauner    // Copied from android.provider.CallLog
61816b68491261362737752e6babc95f89e2b468f49Jay Shrauner    private static Uri addEntryAndRemoveExpiredEntries(Context context, Uri uri,
61916b68491261362737752e6babc95f89e2b468f49Jay Shrauner            ContentValues values) {
62016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        final ContentResolver resolver = context.getContentResolver();
62116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        Uri result = resolver.insert(uri, values);
62216b68491261362737752e6babc95f89e2b468f49Jay Shrauner        resolver.delete(uri, "_id IN " +
62316b68491261362737752e6babc95f89e2b468f49Jay Shrauner                "(SELECT _id FROM calls ORDER BY " + Calls.DEFAULT_SORT_ORDER
62416b68491261362737752e6babc95f89e2b468f49Jay Shrauner                + " LIMIT -1 OFFSET 500)", null);
62516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        return result;
62616b68491261362737752e6babc95f89e2b468f49Jay Shrauner    }
62716b68491261362737752e6babc95f89e2b468f49Jay Shrauner
628326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    private void addManualVoicemail(Long time) {
629326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        final ContentValues contentValues = new ContentValues();
630326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.DATE, time);
631326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.NUMBER, mPhoneNumber.getText().toString());
632326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.DURATION, 5000);
633326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.SOURCE_PACKAGE, getPackageName());
634326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.SOURCE_DATA, 500);
635326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.IS_READ, 0);
636326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
637326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        getContentResolver().insert(VoicemailContract.Voicemails.buildSourceUri(getPackageName()),
638326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                contentValues);
639326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
640326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        updateVoicemailStatus();
641326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    }
642326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
643326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    private void updateVoicemailStatus() {
644326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        ContentResolver contentResolver = getContentResolver();
645326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        Uri statusUri = VoicemailContract.Status.buildSourceUri(getPackageName());
646326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        final PhoneAccountHandle accountHandle = getManualAccount();
647326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
648326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        ContentValues values = new ContentValues();
649326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, getPackageName());
650326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.PHONE_ACCOUNT_ID, "ACCOUNT_ID");
651326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.CONFIGURATION_STATE, VoicemailContract.Status.CONFIGURATION_STATE_OK);
652326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.DATA_CHANNEL_STATE, VoicemailContract.Status.DATA_CHANNEL_STATE_OK);
653326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.NOTIFICATION_CHANNEL_STATE,
654326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK);
655326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
656326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentResolver.insert(statusUri, values);
657326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    }
65894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng}
659