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