FillCallLogTestActivity.java revision 838988bf34229b33ed39bb7dc7109427da264c81
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;
429dc924c8bcc0bc8d996452e9ce3215b5f064962eTyler Gunnimport android.telecom.TelecomManager;
43ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.text.format.DateFormat;
4494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.util.Log;
45c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Leeimport android.view.MotionEvent;
4694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View;
4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Button;
4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.CheckBox;
49ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.DatePicker;
50838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunnimport android.widget.EditText;
5194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.ProgressBar;
52ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.RadioButton;
5394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.TextView;
54ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.TimePicker;
5594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Toast;
5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport com.android.dialer.tests.R;
58838988bf34229b33ed39bb7dc7109427da264c81Andrew Leeimport com.android.dialer.util.AppCompatConstants;
5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
60ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport java.util.Calendar;
6187ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chenimport java.util.List;
6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.Random;
6394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/**
6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Activity to add entries to the call log for testing.
6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */
6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class FillCallLogTestActivity extends Activity {
6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final String TAG = "FillCallLogTestActivity";
6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Identifier of the loader for querying the call log. */
7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int CALLLOG_LOADER_ID = 1;
7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final Random RNG = new Random();
7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int[] CALL_TYPES = new int[] {
74838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        AppCompatConstants.CALLS_INCOMING_TYPE,
75838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        AppCompatConstants.CALLS_OUTGOING_TYPE,
76838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        AppCompatConstants.CALLS_MISSED_TYPE
7794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    };
7894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
7994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private TextView mNumberTextView;
8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private Button mAddButton;
8194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ProgressBar mProgressBar;
8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private CheckBox mUseRandomNumbers;
83ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeIncoming;
84ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeMissed;
85ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeOutgoing;
86326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    private RadioButton mCallTypeVoicemail;
87c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee    private RadioButton mCallTypeCustom;
88c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee    private EditText mCustomCallTypeTextView;
898b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn    private CheckBox mCallTypeVideo;
90ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationAllowed;
91ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationRestricted;
92ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationUnknown;
93ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationPayphone;
94ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mCallDate;
95ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mCallTime;
96ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mPhoneNumber;
97838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn    private EditText mOffset;
98ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
99ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallTimeHour;
100ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallTimeMinute;
101ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateYear;
102ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateMonth;
103ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateDay;
1041d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad    private RadioButton mAccount0;
1051d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad    private RadioButton mAccount1;
10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    @Override
10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    protected void onCreate(Bundle savedInstanceState) {
10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        super.onCreate(savedInstanceState);
11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        setContentView(R.layout.fill_call_log_test);
11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView = (TextView) findViewById(R.id.number);
11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton = (Button) findViewById(R.id.add);
11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar = (ProgressBar) findViewById(R.id.progress);
11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mUseRandomNumbers = (CheckBox) findViewById(R.id.use_random_numbers);
11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setOnClickListener(new View.OnClickListener(){
11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            @Override
11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            public void onClick(View v) {
11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                int count;
12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    count = Integer.parseInt(mNumberTextView.getText().toString());
12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (count > 100) {
12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        throw new RuntimeException("Number too large.  Max=100");
12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RuntimeException e) {
12694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Toast.makeText(FillCallLogTestActivity.this, e.toString(), Toast.LENGTH_LONG)
12794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                            .show();
12894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                addEntriesToCallLog(count, mUseRandomNumbers.isChecked());
13194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mNumberTextView.setEnabled(false);
13294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mAddButton.setEnabled(false);
13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setProgress(0);
13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setMax(count);
13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setVisibility(View.VISIBLE);
13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        });
138ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
139ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeIncoming = (RadioButton) findViewById(R.id.call_type_incoming);
140ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeMissed = (RadioButton) findViewById(R.id.call_type_missed);
141ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeOutgoing = (RadioButton) findViewById(R.id.call_type_outgoing);
142326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        mCallTypeVoicemail = (RadioButton) findViewById(R.id.call_type_voicemail);
143c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        mCallTypeCustom = (RadioButton) findViewById(R.id.call_type_custom);
144c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        mCustomCallTypeTextView = (EditText) findViewById(R.id.call_type_custom_text);
1458b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        mCallTypeVideo = (CheckBox) findViewById(R.id.call_type_video);
146ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationAllowed = (RadioButton) findViewById(R.id.presentation_allowed);
147ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationPayphone = (RadioButton) findViewById(R.id.presentation_payphone);
148ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationUnknown = (RadioButton) findViewById(R.id.presentation_unknown);
149ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationRestricted = (RadioButton) findViewById(R.id.presentation_restricted);
150ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTime = (TextView) findViewById(R.id.call_time);
151ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDate = (TextView) findViewById(R.id.call_date);
152ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPhoneNumber = (TextView) findViewById(R.id.phone_number);
153838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mOffset = (EditText) findViewById(R.id.delta_after_add);
1541d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        mAccount0 = (RadioButton) findViewById(R.id.account0);
1551d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        mAccount1 = (RadioButton) findViewById(R.id.account1);
156ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
157c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        mCustomCallTypeTextView.setOnTouchListener(new View.OnTouchListener() {
158c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            @Override
159c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            public boolean onTouch(View v, MotionEvent event) {
160c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee                mCallTypeCustom.toggle();
161c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee                return false;
162c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            }
163c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        });
164c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee
165ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        // Use the current time as the default values for the picker
166ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        final Calendar c = Calendar.getInstance();
167ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTimeHour = c.get(Calendar.HOUR_OF_DAY);
168ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTimeMinute = c.get(Calendar.MINUTE);
169ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateYear = c.get(Calendar.YEAR);
170ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateMonth = c.get(Calendar.MONTH);
171ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateDay = c.get(Calendar.DAY_OF_MONTH);
172ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        setDisplayDate();
173ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        setDisplayTime();
17494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
17594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
17694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
17794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Adds a number of entries to the call log. The content of the entries is based on existing
17894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * entries.
17994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
18094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries to add
18194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
18294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addEntriesToCallLog(final int count, boolean useRandomNumbers) {
18394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        if (useRandomNumbers) {
18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            addRandomNumbers(count);
18594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        } else {
18694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            getLoaderManager().initLoader(CALLLOG_LOADER_ID, null,
18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    new CallLogLoaderListener(count));
18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Calls when the insertion has completed.
19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param message the message to show in a toast to the user
19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void insertCompleted(String message) {
19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Hide the progress bar.
19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setVisibility(View.GONE);
19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Re-enable the add button.
20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setEnabled(true);
20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setEnabled(true);
20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setText("");
20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Creates a {@link ContentValues} object containing values corresponding to the given cursor.
20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param cursor the cursor from which to get the values
21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @return a newly created content values object
21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ContentValues createContentValuesFromCursor(Cursor cursor) {
21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues values = new ContentValues();
21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int column = 0; column < cursor.getColumnCount();
21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ++column) {
21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            String name = cursor.getColumnName(column);
21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            switch (cursor.getType(column)) {
21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_STRING:
22094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getString(column));
22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_INTEGER:
22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getLong(column));
22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_FLOAT:
22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getDouble(column));
22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_BLOB:
22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getBlob(column));
23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_NULL:
23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.putNull(name);
23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                default:
23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "Invalid value in cursor: " + cursor.getType(column));
23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return values;
24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addRandomNumbers(int count) {
24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues[] values = new ContentValues[count];
24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int i = 0; i < count; i++) {
24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i] = new ContentValues();
24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.NUMBER, generateRandomNumber());
247719a7adde25e0a717816b00668c16c3a1e3c5518Jay Shrauner            values[i].put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_ALLOWED);
24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DATE, System.currentTimeMillis()); // Will be randomized later
24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DURATION, 1); // Will be overwritten later
25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        new AsyncCallLogInserter(values).execute(new Void[0]);
25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static String generateRandomNumber() {
25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return String.format("5%09d", RNG.nextInt(1000000000));
25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Invokes {@link AsyncCallLogInserter} when the call log has loaded. */
25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class CallLogLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
26094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert when done. */
26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final int mCount;
26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private CallLogLoaderListener(int count) {
26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mCount = count;
26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onCreateLoader");
27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return new CursorLoader(FillCallLogTestActivity.this, Calls.CONTENT_URI,
27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    null, null, null, null);
27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
27394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
27594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
27694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            try {
27794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                Log.d(TAG, "onLoadFinished");
27894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (data.getCount() == 0) {
28094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    // If there are no entries in the call log, we cannot generate new ones.
28194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    insertCompleted(getString(R.string.noLogEntriesToast));
28294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
28394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
28494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                data.moveToPosition(-1);
28694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues[] values = new ContentValues[mCount];
28894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                for (int index = 0; index < mCount; ++index) {
28994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (!data.moveToNext()) {
29094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        data.moveToFirst();
29194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
29294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values[index] = createContentValuesFromCursor(data);
29394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
29494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                new AsyncCallLogInserter(values).execute(new Void[0]);
29594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            } finally {
29694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // This is a one shot loader.
29794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                getLoaderManager().destroyLoader(CALLLOG_LOADER_ID);
29894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
29994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
30094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
30194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
30294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoaderReset(Loader<Cursor> loader) {}
30394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
30494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
30594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Inserts a given number of entries in the call log based on the values given. */
30694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class AsyncCallLogInserter extends AsyncTask<Void, Integer, Integer> {
30794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert. */
30894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final ContentValues[] mValues;
30994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
31094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public AsyncCallLogInserter(ContentValues[] values) {
31194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mValues = values;
31294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
31394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
31494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
31594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected Integer doInBackground(Void... params) {
31694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "doInBackground");
31794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return insertIntoCallLog();
31894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
31994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
32094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
32194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onProgressUpdate(Integer... values) {
32294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onProgressUpdate");
32394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            updateCount(values[0]);
32494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
32594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
32694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
32794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onPostExecute(Integer count) {
32894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onPostExecute");
32994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            insertCompleted(getString(R.string.addedLogEntriesToast, count));
33094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
33194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
33294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /**
33394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * Inserts a number of entries in the call log based on the given templates.
33494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         *
33594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * @return the number of inserted entries
33694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         */
33794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private Integer insertIntoCallLog() {
33894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int inserted = 0;
33994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
34094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            for (int index = 0; index < mValues.length; ++index) {
34194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues values = mValues[index];
34294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // These should not be set.
34394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls._ID);
34494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the date. For each new entry being added, add an extra
34594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // day to the maximum possible offset from the original.
34694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.DATE,
34794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        values.getAsLong(Calls.DATE)
34894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        - RNG.nextInt(24 * 60 * 60 * (index + 1)) * 1000L);
34994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the duration.
35094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (values.getAsLong(Calls.DURATION) > 0) {
35194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(Calls.DURATION, RNG.nextInt(30 * 60 * 60 * 1000));
35294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
35394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
35494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Overwrite type.
35594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.TYPE, CALL_TYPES[RNG.nextInt(CALL_TYPES.length)]);
35694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
35794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Clear cached columns.
35894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_FORMATTED_NUMBER);
35994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_LOOKUP_URI);
36094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_MATCHED_NUMBER);
36194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NAME);
36294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NORMALIZED_NUMBER);
36394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_LABEL);
36494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_TYPE);
36594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_PHOTO_ID);
36694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
36794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Insert into the call log the newly generated entry.
36894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentProviderClient contentProvider =
36994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        getContentResolver().acquireContentProviderClient(
37094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                                Calls.CONTENT_URI);
37194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
37294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "adding entry to call log");
37394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    contentProvider.insert(Calls.CONTENT_URI, values);
37494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    ++inserted;
37594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    this.publishProgress(inserted);
37694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RemoteException e) {
37794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "insert failed", e);
37894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
37994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
38094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return inserted;
38194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
38294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
38394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
38494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
38594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Updates the count shown to the user corresponding to the number of entries added.
38694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
38794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries inserted so far
38894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
38994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void updateCount(Integer count) {
39094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setProgress(count);
39194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
392ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
393ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
394ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Determines the call type for a manually entered call.
395ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
396ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @return Call type.
397ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
398ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int getManualCallType() {
399ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        if (mCallTypeIncoming.isChecked()) {
400838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_INCOMING_TYPE;
401ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mCallTypeOutgoing.isChecked()) {
402838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_OUTGOING_TYPE;
403326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        } else if (mCallTypeVoicemail.isChecked()) {
404838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_VOICEMAIL_TYPE;
405c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee        } else if (mCallTypeCustom.isChecked()) {
406c843bc787b2de729f97e5deb0176b541d1884e8cAndrew Lee            return Integer.parseInt(mCustomCallTypeTextView.getText().toString());
407ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else {
408838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee            return AppCompatConstants.CALLS_MISSED_TYPE;
409ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
410ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
411ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
412ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
413ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Determines the presentation for a manually entered call.
414ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
415ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @return Presentation.
416ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
417ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int getManualPresentation() {
418ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        if (mPresentationAllowed.isChecked()) {
419ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_ALLOWED;
420ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mPresentationPayphone.isChecked()) {
421ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_PAYPHONE;
422ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mPresentationRestricted.isChecked()) {
423ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_RESTRICTED;
424ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else {
425ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_UNKNOWN;
426ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
427ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
428ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
429c329bfb6d47f20237d22e13297d5bbb72e612919Evan Charlton    private PhoneAccountHandle getManualAccount() {
43016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        TelecomManager telecomManager =
43116b68491261362737752e6babc95f89e2b468f49Jay Shrauner            (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
432fb49f977e59c142aee019fa5aa040e7308e534e0Nancy Chen        List <PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts();
4331d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        if (mAccount0.isChecked()) {
434a2eadf3d68d4f6d0a948d37bc48e930115723ce0Evan Charlton            return accountHandles.get(0);
4351d1bd0da0b32a5b8cb1c7c5585acccb180b19849Ihab Awad        } else if (mAccount1.isChecked()){
436a2eadf3d68d4f6d0a948d37bc48e930115723ce0Evan Charlton            return accountHandles.get(1);
43787ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        } else {
43887ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen            return null;
43987ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        }
44087ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen    }
44187ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen
442ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
443ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Shows a time picker dialog, storing the results in the time field.
444ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
445ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void showTimePickerDialog(View v) {
446ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        DialogFragment newFragment = new TimePickerFragment();
447ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        newFragment.show(getFragmentManager(),"timePicker");
448ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
449ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
450ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
451ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Helper class to display time picker and store the hour/minute.
452ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
453ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public class TimePickerFragment extends DialogFragment
454ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            implements TimePickerDialog.OnTimeSetListener {
455ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
456ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        @Override
457ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public Dialog onCreateDialog(Bundle savedInstanceState) {
458ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            // Create a new instance of TimePickerDialog and return it
459ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return new TimePickerDialog(getActivity(), this, mCallTimeHour, mCallTimeMinute,
460ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                    DateFormat.is24HourFormat(getActivity()));
461ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
462ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
463ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
464ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallTimeHour = hourOfDay;
465ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallTimeMinute = minute;
466ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            setDisplayTime();
467ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
468ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
469ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
470ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
471ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Sets the call time TextView to the current selected time.
472ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
473ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private void setDisplayTime() {
474ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTime.setText(String.format("%02d:%02d", mCallTimeHour, mCallTimeMinute));
475ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
476ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
477ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
478ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Sets the call date Textview to the current selected date
479ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
480ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private void setDisplayDate() {
481ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDate.setText(String.format("%04d-%02d-%02d", mCallDateYear, mCallDateMonth,
482ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                mCallDateDay));
483ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
484ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
485ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
486ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Shows a date picker dialog.
487ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
488ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void showDatePickerDialog(View v) {
489ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        DialogFragment newFragment = new DatePickerFragment();
490ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        newFragment.show(getFragmentManager(),"datePicker");
491ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
492ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
493ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
494ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Helper class to show a date picker.
495ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
496ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public class DatePickerFragment extends DialogFragment
497ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            implements DatePickerDialog.OnDateSetListener {
498ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
499ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        @Override
500ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public Dialog onCreateDialog(Bundle savedInstanceState) {
501ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            // Create a new instance of DatePickerDialog and return it
502ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return new DatePickerDialog(getActivity(), this, mCallDateYear, mCallDateMonth,
503ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                    mCallDateDay);
504ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
505ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
506ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public void onDateSet(DatePicker view, int year, int month, int day) {
507ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateYear = year;
508ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateMonth = month;
509ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateDay = day;
510ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            setDisplayDate();
511ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
512ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
513ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
514ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
515ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * OnClick handler for the button that adds a manual call log entry to the call log.
516ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
517ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @param v Calling view.
518ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
519ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void addManualEntry(View v) {
520ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        Calendar dateTime = Calendar.getInstance();
521ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        dateTime.set(mCallDateYear, mCallDateMonth, mCallDateDay, mCallTimeHour, mCallTimeMinute);
522ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
52303610993bf2adf12a6962c32851095551ffd0043Yorke Lee        int features = mCallTypeVideo.isChecked() ? Calls.FEATURES_VIDEO : 0;
5248b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        Long dataUsage = null;
5258b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        if (mCallTypeVideo.isChecked()) {
5268b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn            // Some random data usage up to 50MB.
5278b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn            dataUsage = (long) RNG.nextInt(52428800);
5288b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn        }
5298b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn
530838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        if (getManualCallType() == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
531326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee            addManualVoicemail(dateTime.getTimeInMillis());
532326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        } else {
53316b68491261362737752e6babc95f89e2b468f49Jay Shrauner            addCall(mPhoneNumber.getText().toString(), getManualPresentation(),
534326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                    getManualCallType(), features, getManualAccount(),
535326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                    dateTime.getTimeInMillis(), RNG.nextInt(60 * 60), dataUsage);
536326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        }
537ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
538838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        // Subtract offset from the call date/time and store as new date/time
539838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        int offset = Integer.parseInt(mOffset.getText().toString());
540838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn
541838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        dateTime.add(Calendar.MINUTE, offset);
542838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateYear = dateTime.get(Calendar.YEAR);
543838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateMonth = dateTime.get(Calendar.MONTH);
544838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateDay = dateTime.get(Calendar.DAY_OF_MONTH);
545838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallTimeHour = dateTime.get(Calendar.HOUR_OF_DAY);
546838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallTimeMinute = dateTime.get(Calendar.MINUTE);
547838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        setDisplayDate();
548838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        setDisplayTime();
549ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
550326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
55116b68491261362737752e6babc95f89e2b468f49Jay Shrauner    // Copied and modified to compile unbundled from android.provider.CallLog
55216b68491261362737752e6babc95f89e2b468f49Jay Shrauner    public Uri addCall(String number,
55316b68491261362737752e6babc95f89e2b468f49Jay Shrauner            int presentation, int callType, int features, PhoneAccountHandle accountHandle,
55416b68491261362737752e6babc95f89e2b468f49Jay Shrauner            long start, int duration, Long dataUsage) {
55516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        final ContentResolver resolver = getContentResolver();
55616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        int numberPresentation = Calls.PRESENTATION_ALLOWED;
55716b68491261362737752e6babc95f89e2b468f49Jay Shrauner
55816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        TelecomManager tm = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
55916b68491261362737752e6babc95f89e2b468f49Jay Shrauner
56016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        String accountAddress = null;
56116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (tm != null && accountHandle != null) {
56216b68491261362737752e6babc95f89e2b468f49Jay Shrauner            PhoneAccount account = tm.getPhoneAccount(accountHandle);
56316b68491261362737752e6babc95f89e2b468f49Jay Shrauner            if (account != null) {
56416b68491261362737752e6babc95f89e2b468f49Jay Shrauner                Uri address = account.getSubscriptionAddress();
56516b68491261362737752e6babc95f89e2b468f49Jay Shrauner                if (address != null) {
56616b68491261362737752e6babc95f89e2b468f49Jay Shrauner                    accountAddress = address.getSchemeSpecificPart();
56716b68491261362737752e6babc95f89e2b468f49Jay Shrauner                }
56816b68491261362737752e6babc95f89e2b468f49Jay Shrauner            }
56916b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
57016b68491261362737752e6babc95f89e2b468f49Jay Shrauner
57116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (numberPresentation != Calls.PRESENTATION_ALLOWED) {
57216b68491261362737752e6babc95f89e2b468f49Jay Shrauner            number = "";
57316b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
57416b68491261362737752e6babc95f89e2b468f49Jay Shrauner
57516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        // accountHandle information
57616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        String accountComponentString = null;
57716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        String accountId = null;
57816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (accountHandle != null) {
57916b68491261362737752e6babc95f89e2b468f49Jay Shrauner            accountComponentString = accountHandle.getComponentName().flattenToString();
58016b68491261362737752e6babc95f89e2b468f49Jay Shrauner            accountId = accountHandle.getId();
58116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
58216b68491261362737752e6babc95f89e2b468f49Jay Shrauner
58316b68491261362737752e6babc95f89e2b468f49Jay Shrauner        ContentValues values = new ContentValues(6);
58416b68491261362737752e6babc95f89e2b468f49Jay Shrauner
58516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.NUMBER, number);
58616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.NUMBER_PRESENTATION, Integer.valueOf(numberPresentation));
58716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.TYPE, Integer.valueOf(callType));
58816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.FEATURES, features);
58916b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.DATE, Long.valueOf(start));
59016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.DURATION, Long.valueOf(duration));
59116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        if (dataUsage != null) {
59216b68491261362737752e6babc95f89e2b468f49Jay Shrauner            values.put(Calls.DATA_USAGE, dataUsage);
59316b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
59416b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.PHONE_ACCOUNT_COMPONENT_NAME, accountComponentString);
59516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.PHONE_ACCOUNT_ID, accountId);
59616b68491261362737752e6babc95f89e2b468f49Jay Shrauner        // Calls.PHONE_ACCOUNT_ADDRESS
59716b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put("phone_account_address", accountAddress);
59816b68491261362737752e6babc95f89e2b468f49Jay Shrauner        values.put(Calls.NEW, Integer.valueOf(1));
59916b68491261362737752e6babc95f89e2b468f49Jay Shrauner
600838988bf34229b33ed39bb7dc7109427da264c81Andrew Lee        if (callType == AppCompatConstants.CALLS_MISSED_TYPE) {
60116b68491261362737752e6babc95f89e2b468f49Jay Shrauner            values.put(Calls.IS_READ, 0);
60216b68491261362737752e6babc95f89e2b468f49Jay Shrauner        }
60316b68491261362737752e6babc95f89e2b468f49Jay Shrauner
60416b68491261362737752e6babc95f89e2b468f49Jay Shrauner        return addEntryAndRemoveExpiredEntries(this, Calls.CONTENT_URI, values);
60516b68491261362737752e6babc95f89e2b468f49Jay Shrauner    }
60616b68491261362737752e6babc95f89e2b468f49Jay Shrauner
60716b68491261362737752e6babc95f89e2b468f49Jay Shrauner    // Copied from android.provider.CallLog
60816b68491261362737752e6babc95f89e2b468f49Jay Shrauner    private static Uri addEntryAndRemoveExpiredEntries(Context context, Uri uri,
60916b68491261362737752e6babc95f89e2b468f49Jay Shrauner            ContentValues values) {
61016b68491261362737752e6babc95f89e2b468f49Jay Shrauner        final ContentResolver resolver = context.getContentResolver();
61116b68491261362737752e6babc95f89e2b468f49Jay Shrauner        Uri result = resolver.insert(uri, values);
61216b68491261362737752e6babc95f89e2b468f49Jay Shrauner        resolver.delete(uri, "_id IN " +
61316b68491261362737752e6babc95f89e2b468f49Jay Shrauner                "(SELECT _id FROM calls ORDER BY " + Calls.DEFAULT_SORT_ORDER
61416b68491261362737752e6babc95f89e2b468f49Jay Shrauner                + " LIMIT -1 OFFSET 500)", null);
61516b68491261362737752e6babc95f89e2b468f49Jay Shrauner        return result;
61616b68491261362737752e6babc95f89e2b468f49Jay Shrauner    }
61716b68491261362737752e6babc95f89e2b468f49Jay Shrauner
618326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    private void addManualVoicemail(Long time) {
619326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        final ContentValues contentValues = new ContentValues();
620326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.DATE, time);
621326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.NUMBER, mPhoneNumber.getText().toString());
622326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.DURATION, 5000);
623326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.SOURCE_PACKAGE, getPackageName());
624326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.SOURCE_DATA, 500);
625326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentValues.put(Voicemails.IS_READ, 0);
626326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
627326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        getContentResolver().insert(VoicemailContract.Voicemails.buildSourceUri(getPackageName()),
628326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                contentValues);
629326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
630326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        updateVoicemailStatus();
631326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    }
632326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
633326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    private void updateVoicemailStatus() {
634326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        ContentResolver contentResolver = getContentResolver();
635326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        Uri statusUri = VoicemailContract.Status.buildSourceUri(getPackageName());
636326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        final PhoneAccountHandle accountHandle = getManualAccount();
637326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
638326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        ContentValues values = new ContentValues();
639326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, getPackageName());
640326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.PHONE_ACCOUNT_ID, "ACCOUNT_ID");
641326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.CONFIGURATION_STATE, VoicemailContract.Status.CONFIGURATION_STATE_OK);
642326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.DATA_CHANNEL_STATE, VoicemailContract.Status.DATA_CHANNEL_STATE_OK);
643326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        values.put(Status.NOTIFICATION_CHANNEL_STATE,
644326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee                VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK);
645326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee
646326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee        contentResolver.insert(statusUri, values);
647326bc22ade3e340d9f0a421f597e507629bf2c1eYorke Lee    }
64894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng}
649