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