127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda/* 227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Copyright (C) 2011 The Android Open Source Project 327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Licensed under the Apache License, Version 2.0 (the "License"); 527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * you may not use this file except in compliance with the License. 627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * You may obtain a copy of the License at 727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * http://www.apache.org/licenses/LICENSE-2.0 927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 1027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Unless required by applicable law or agreed to in writing, software 1127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * distributed under the License is distributed on an "AS IS" BASIS, 1227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * See the License for the specific language governing permissions and 1427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * limitations under the License. 1527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 1627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 1727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdapackage com.android.contacts.tests.calllog; 1827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 1927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.app.Activity; 2027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.app.LoaderManager; 2127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.content.ContentProviderClient; 2227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.content.ContentValues; 2327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.content.CursorLoader; 2427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.content.Loader; 2527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.database.Cursor; 2627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.os.AsyncTask; 2727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.os.Bundle; 2827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.os.RemoteException; 2927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.provider.CallLog.Calls; 3027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.util.Log; 3127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.view.View; 3227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.widget.Button; 332c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onukiimport android.widget.CheckBox; 3427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.widget.ProgressBar; 3527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.widget.TextView; 3627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdaimport android.widget.Toast; 3727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.tests.R; 39e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 402c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onukiimport java.util.Random; 4127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 4227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda/** 4327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Activity to add entries to the call log for testing. 4427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 4527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerdapublic class FillCallLogTestActivity extends Activity { 4627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private static final String TAG = "FillCallLogTestActivity"; 4727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** Identifier of the loader for querying the call log. */ 4827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private static final int CALLLOG_LOADER_ID = 1; 4927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 502c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki private static final Random RNG = new Random(); 512c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki private static final int[] CALL_TYPES = new int[] { 522c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.MISSED_TYPE, 532c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki }; 542c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 5527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private TextView mNumberTextView; 5627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private Button mAddButton; 5727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private ProgressBar mProgressBar; 582c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki private CheckBox mUseRandomNumbers; 5927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 6027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 6127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda protected void onCreate(Bundle savedInstanceState) { 6227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda super.onCreate(savedInstanceState); 6327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda setContentView(R.layout.fill_call_log_test); 6427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mNumberTextView = (TextView) findViewById(R.id.number); 6527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mAddButton = (Button) findViewById(R.id.add); 6627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mProgressBar = (ProgressBar) findViewById(R.id.progress); 672c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki mUseRandomNumbers = (CheckBox) findViewById(R.id.use_random_numbers); 6827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 6927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mAddButton.setOnClickListener(new View.OnClickListener(){ 7027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 7127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda public void onClick(View v) { 722c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki int count; 732c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki try { 742c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki count = Integer.parseInt(mNumberTextView.getText().toString()); 752c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki if (count > 100) { 762c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki throw new RuntimeException("Number too large. Max=100"); 772c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 782c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } catch (RuntimeException e) { 792c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki Toast.makeText(FillCallLogTestActivity.this, e.toString(), Toast.LENGTH_LONG) 802c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki .show(); 812c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki return; 822c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 832c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki addEntriesToCallLog(count, mUseRandomNumbers.isChecked()); 8427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mNumberTextView.setEnabled(false); 8527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mAddButton.setEnabled(false); 8627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mProgressBar.setProgress(0); 8727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mProgressBar.setMax(count); 8827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mProgressBar.setVisibility(View.VISIBLE); 8927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 9027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda }); 9127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 9227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 9327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** 9427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Adds a number of entries to the call log. The content of the entries is based on existing 9527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * entries. 9627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 9727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * @param count the number of entries to add 9827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 992c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki private void addEntriesToCallLog(final int count, boolean useRandomNumbers) { 1002c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki if (useRandomNumbers) { 1012c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki addRandomNumbers(count); 1022c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } else { 1032c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki getLoaderManager().initLoader(CALLLOG_LOADER_ID, null, 1042c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki new CallLogLoaderListener(count)); 1052c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 10627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 10727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 10827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** 10927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Calls when the insertion has completed. 11027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 11127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * @param message the message to show in a toast to the user 11227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 11327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private void insertCompleted(String message) { 11427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // Hide the progress bar. 11527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mProgressBar.setVisibility(View.GONE); 11627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // Re-enable the add button. 11727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mNumberTextView.setEnabled(true); 11827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mAddButton.setEnabled(true); 11927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mNumberTextView.setText(""); 12027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 12127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 12227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 12327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 12427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** 12527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Creates a {@link ContentValues} object containing values corresponding to the given cursor. 12627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 12727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * @param cursor the cursor from which to get the values 12827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * @return a newly created content values object 12927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 13027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private ContentValues createContentValuesFromCursor(Cursor cursor) { 13127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda ContentValues values = new ContentValues(); 13227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda for (int column = 0; column < cursor.getColumnCount(); 13327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda ++column) { 13427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda String name = cursor.getColumnName(column); 13527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda switch (cursor.getType(column)) { 13627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda case Cursor.FIELD_TYPE_STRING: 13727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.put(name, cursor.getString(column)); 13827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda break; 13927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda case Cursor.FIELD_TYPE_INTEGER: 14027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.put(name, cursor.getLong(column)); 14127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda break; 14227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda case Cursor.FIELD_TYPE_FLOAT: 14327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.put(name, cursor.getDouble(column)); 14427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda break; 14527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda case Cursor.FIELD_TYPE_BLOB: 14627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.put(name, cursor.getBlob(column)); 14727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda break; 14827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda case Cursor.FIELD_TYPE_NULL: 14927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.putNull(name); 15027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda break; 15127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda default: 15227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "Invalid value in cursor: " + cursor.getType(column)); 15327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda break; 15427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 15527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 15627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda return values; 15727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 15827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 1592c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki private void addRandomNumbers(int count) { 1602c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki ContentValues[] values = new ContentValues[count]; 1612c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki for (int i = 0; i < count; i++) { 1622c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values[i] = new ContentValues(); 1632c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values[i].put(Calls.NUMBER, generateRandomNumber()); 1642c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values[i].put(Calls.DATE, System.currentTimeMillis()); // Will be randomized later 1652c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values[i].put(Calls.DURATION, 1); // Will be overwritten later 1662c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 1672c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki new AsyncCallLogInserter(values).execute(new Void[0]); 1682c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 1692c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 1702c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki private static String generateRandomNumber() { 1712c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki return String.format("5%09d", RNG.nextInt(1000000000)); 1722c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 1732c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 17427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** Invokes {@link AsyncCallLogInserter} when the call log has loaded. */ 17527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private final class CallLogLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> { 17627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** The number of items to insert when done. */ 17727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private final int mCount; 17827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 17927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private CallLogLoaderListener(int count) { 18027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mCount = count; 18127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 18227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 18327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 18427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda public Loader<Cursor> onCreateLoader(int id, Bundle args) { 18527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "onCreateLoader"); 18627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda return new CursorLoader(FillCallLogTestActivity.this, Calls.CONTENT_URI, 18727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda null, null, null, null); 18827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 18927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 19027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 19127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 1922c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki try { 1932c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki Log.d(TAG, "onLoadFinished"); 19427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 1952c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki if (data.getCount() == 0) { 1962c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki // If there are no entries in the call log, we cannot generate new ones. 1972c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki insertCompleted(getString(R.string.noLogEntriesToast)); 1982c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki return; 19927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 2002c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 2012c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki data.moveToPosition(-1); 2022c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 2032c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki ContentValues[] values = new ContentValues[mCount]; 2042c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki for (int index = 0; index < mCount; ++index) { 2052c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki if (!data.moveToNext()) { 2062c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki data.moveToFirst(); 2072c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } 20827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values[index] = createContentValuesFromCursor(data); 20927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 2102c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki new AsyncCallLogInserter(values).execute(new Void[0]); 2112c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki } finally { 2122c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki // This is a one shot loader. 2132c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki getLoaderManager().destroyLoader(CALLLOG_LOADER_ID); 21427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 21527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 21627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 21727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 21827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda public void onLoaderReset(Loader<Cursor> loader) {} 21927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 22027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 22127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** Inserts a given number of entries in the call log based on the values given. */ 22227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private final class AsyncCallLogInserter extends AsyncTask<Void, Integer, Integer> { 22327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** The number of items to insert. */ 22427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private final ContentValues[] mValues; 22527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 2262c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki public AsyncCallLogInserter(ContentValues[] values) { 22727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mValues = values; 22827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 22927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 23027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 23127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda protected Integer doInBackground(Void... params) { 23227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "doInBackground"); 23327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda return insertIntoCallLog(); 23427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 23527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 23627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 23727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda protected void onProgressUpdate(Integer... values) { 23827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "onProgressUpdate"); 23927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda updateCount(values[0]); 24027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 24127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 24227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda @Override 24327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda protected void onPostExecute(Integer count) { 24427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "onPostExecute"); 24527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda insertCompleted(getString(R.string.addedLogEntriesToast, count)); 24627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 24727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 24827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** 24927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Inserts a number of entries in the call log based on the given templates. 25027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 25127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * @return the number of inserted entries 25227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 25327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda private Integer insertIntoCallLog() { 25427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda int inserted = 0; 25527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 2562c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki for (int index = 0; index < mValues.length; ++index) { 2572c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki ContentValues values = mValues[index]; 25827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // These should not be set. 25927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.putNull(Calls._ID); 26027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // Add some randomness to the date. For each new entry being added, add an extra 26127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // day to the maximum possible offset from the original. 26227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.put(Calls.DATE, 26327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda values.getAsLong(Calls.DATE) 2642c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki - RNG.nextInt(24 * 60 * 60 * (index + 1)) * 1000L); 26527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // Add some randomness to the duration. 26627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda if (values.getAsLong(Calls.DURATION) > 0) { 2672c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.put(Calls.DURATION, RNG.nextInt(30 * 60 * 60 * 1000)); 26827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 2692c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 2702c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki // Overwrite type. 2712c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.put(Calls.TYPE, CALL_TYPES[RNG.nextInt(CALL_TYPES.length)]); 2722c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 2732c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki // Clear cached columns. 2742c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_FORMATTED_NUMBER); 2752c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_LOOKUP_URI); 2762c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_MATCHED_NUMBER); 2772c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_NAME); 2782c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_NORMALIZED_NUMBER); 2792c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_NUMBER_LABEL); 2802c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_NUMBER_TYPE); 2812c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki values.putNull(Calls.CACHED_PHOTO_ID); 2822c428c743d2c47139c838a8b8fd3a4996e692674Makoto Onuki 28327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda // Insert into the call log the newly generated entry. 28427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda ContentProviderClient contentProvider = 28527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda getContentResolver().acquireContentProviderClient( 28627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Calls.CONTENT_URI); 28727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda try { 28827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "adding entry to call log"); 28927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda contentProvider.insert(Calls.CONTENT_URI, values); 29027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda ++inserted; 29127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda this.publishProgress(inserted); 29227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } catch (RemoteException e) { 29327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda Log.d(TAG, "insert failed", e); 29427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 29527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 29627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda return inserted; 29727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 29827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 29927d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda 30027d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda /** 30127d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * Updates the count shown to the user corresponding to the number of entries added. 30227d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * 30327d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda * @param count the number of entries inserted so far 30427d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda */ 30527d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda public void updateCount(Integer count) { 30627d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda mProgressBar.setProgress(count); 30727d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda } 30827d764890eeb6fb777617a781068eb0fef7558dbFlavio Lerda} 309