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