FillCallLogTestActivity.java revision 719a7adde25e0a717816b00668c16c3a1e3c5518
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;
2094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.app.LoaderManager;
2194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentProviderClient;
2294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentValues;
2394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.CursorLoader;
2494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.Loader;
2594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.database.Cursor;
2694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.AsyncTask;
2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.Bundle;
2894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.RemoteException;
2994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.CallLog.Calls;
3094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.util.Log;
3194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View;
3294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Button;
3394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.CheckBox;
3494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.ProgressBar;
3594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.TextView;
3694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Toast;
3794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
3894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport com.android.dialer.tests.R;
3994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
4094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.Random;
4194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
4294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/**
4394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Activity to add entries to the call log for testing.
4494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */
4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class FillCallLogTestActivity extends Activity {
4694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final String TAG = "FillCallLogTestActivity";
4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Identifier of the loader for querying the call log. */
4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int CALLLOG_LOADER_ID = 1;
4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final Random RNG = new Random();
5194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int[] CALL_TYPES = new int[] {
5294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.MISSED_TYPE,
5394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    };
5494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private TextView mNumberTextView;
5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private Button mAddButton;
5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ProgressBar mProgressBar;
5894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private CheckBox mUseRandomNumbers;
5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    @Override
6194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    protected void onCreate(Bundle savedInstanceState) {
6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        super.onCreate(savedInstanceState);
6394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        setContentView(R.layout.fill_call_log_test);
6494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView = (TextView) findViewById(R.id.number);
6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton = (Button) findViewById(R.id.add);
6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar = (ProgressBar) findViewById(R.id.progress);
6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mUseRandomNumbers = (CheckBox) findViewById(R.id.use_random_numbers);
6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setOnClickListener(new View.OnClickListener(){
7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            @Override
7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            public void onClick(View v) {
7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                int count;
7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
7494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    count = Integer.parseInt(mNumberTextView.getText().toString());
7594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (count > 100) {
7694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        throw new RuntimeException("Number too large.  Max=100");
7794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
7894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RuntimeException e) {
7994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Toast.makeText(FillCallLogTestActivity.this, e.toString(), Toast.LENGTH_LONG)
8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                            .show();
8194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
8394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                addEntriesToCallLog(count, mUseRandomNumbers.isChecked());
8494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mNumberTextView.setEnabled(false);
8594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mAddButton.setEnabled(false);
8694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setProgress(0);
8794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setMax(count);
8894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setVisibility(View.VISIBLE);
8994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
9094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        });
9194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
9294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
9394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
9494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Adds a number of entries to the call log. The content of the entries is based on existing
9594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * entries.
9694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
9794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries to add
9894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
9994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addEntriesToCallLog(final int count, boolean useRandomNumbers) {
10094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        if (useRandomNumbers) {
10194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            addRandomNumbers(count);
10294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        } else {
10394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            getLoaderManager().initLoader(CALLLOG_LOADER_ID, null,
10494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    new CallLogLoaderListener(count));
10594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Calls when the insertion has completed.
11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param message the message to show in a toast to the user
11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void insertCompleted(String message) {
11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Hide the progress bar.
11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setVisibility(View.GONE);
11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Re-enable the add button.
11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setEnabled(true);
11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setEnabled(true);
11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setText("");
12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Creates a {@link ContentValues} object containing values corresponding to the given cursor.
12694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
12794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param cursor the cursor from which to get the values
12894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @return a newly created content values object
12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ContentValues createContentValuesFromCursor(Cursor cursor) {
13194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues values = new ContentValues();
13294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int column = 0; column < cursor.getColumnCount();
13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ++column) {
13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            String name = cursor.getColumnName(column);
13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            switch (cursor.getType(column)) {
13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_STRING:
13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getString(column));
13894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
13994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_INTEGER:
14094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getLong(column));
14194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
14294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_FLOAT:
14394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getDouble(column));
14494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
14594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_BLOB:
14694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getBlob(column));
14794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
14894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_NULL:
14994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.putNull(name);
15094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
15194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                default:
15294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "Invalid value in cursor: " + cursor.getType(column));
15394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
15494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
15594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
15694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return values;
15794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
15894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
15994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addRandomNumbers(int count) {
16094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues[] values = new ContentValues[count];
16194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int i = 0; i < count; i++) {
16294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i] = new ContentValues();
16394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.NUMBER, generateRandomNumber());
164719a7adde25e0a717816b00668c16c3a1e3c5518Jay Shrauner            values[i].put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_ALLOWED);
16594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DATE, System.currentTimeMillis()); // Will be randomized later
16694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DURATION, 1); // Will be overwritten later
16794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
16894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        new AsyncCallLogInserter(values).execute(new Void[0]);
16994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
17094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
17194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static String generateRandomNumber() {
17294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return String.format("5%09d", RNG.nextInt(1000000000));
17394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
17494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
17594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Invokes {@link AsyncCallLogInserter} when the call log has loaded. */
17694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class CallLogLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
17794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert when done. */
17894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final int mCount;
17994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
18094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private CallLogLoaderListener(int count) {
18194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mCount = count;
18294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
18394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
18594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
18694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onCreateLoader");
18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return new CursorLoader(FillCallLogTestActivity.this, Calls.CONTENT_URI,
18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    null, null, null, null);
18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            try {
19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                Log.d(TAG, "onLoadFinished");
19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (data.getCount() == 0) {
19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    // If there are no entries in the call log, we cannot generate new ones.
19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    insertCompleted(getString(R.string.noLogEntriesToast));
19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                data.moveToPosition(-1);
20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues[] values = new ContentValues[mCount];
20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                for (int index = 0; index < mCount; ++index) {
20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (!data.moveToNext()) {
20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        data.moveToFirst();
20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values[index] = createContentValuesFromCursor(data);
21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                new AsyncCallLogInserter(values).execute(new Void[0]);
21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            } finally {
21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // This is a one shot loader.
21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                getLoaderManager().destroyLoader(CALLLOG_LOADER_ID);
21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoaderReset(Loader<Cursor> loader) {}
22094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Inserts a given number of entries in the call log based on the values given. */
22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class AsyncCallLogInserter extends AsyncTask<Void, Integer, Integer> {
22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert. */
22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final ContentValues[] mValues;
22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public AsyncCallLogInserter(ContentValues[] values) {
22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mValues = values;
22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected Integer doInBackground(Void... params) {
23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "doInBackground");
23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return insertIntoCallLog();
23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onProgressUpdate(Integer... values) {
23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onProgressUpdate");
24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            updateCount(values[0]);
24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onPostExecute(Integer count) {
24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onPostExecute");
24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            insertCompleted(getString(R.string.addedLogEntriesToast, count));
24794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /**
25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * Inserts a number of entries in the call log based on the given templates.
25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         *
25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * @return the number of inserted entries
25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         */
25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private Integer insertIntoCallLog() {
25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int inserted = 0;
25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            for (int index = 0; index < mValues.length; ++index) {
25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues values = mValues[index];
25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // These should not be set.
26094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls._ID);
26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the date. For each new entry being added, add an extra
26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // day to the maximum possible offset from the original.
26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.DATE,
26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        values.getAsLong(Calls.DATE)
26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        - RNG.nextInt(24 * 60 * 60 * (index + 1)) * 1000L);
26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the duration.
26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (values.getAsLong(Calls.DURATION) > 0) {
26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(Calls.DURATION, RNG.nextInt(30 * 60 * 60 * 1000));
26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Overwrite type.
27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.TYPE, CALL_TYPES[RNG.nextInt(CALL_TYPES.length)]);
27394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Clear cached columns.
27594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_FORMATTED_NUMBER);
27694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_LOOKUP_URI);
27794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_MATCHED_NUMBER);
27894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NAME);
27994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NORMALIZED_NUMBER);
28094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_LABEL);
28194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_TYPE);
28294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_PHOTO_ID);
28394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Insert into the call log the newly generated entry.
28594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentProviderClient contentProvider =
28694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        getContentResolver().acquireContentProviderClient(
28794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                                Calls.CONTENT_URI);
28894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
28994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "adding entry to call log");
29094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    contentProvider.insert(Calls.CONTENT_URI, values);
29194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    ++inserted;
29294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    this.publishProgress(inserted);
29394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RemoteException e) {
29494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "insert failed", e);
29594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
29694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
29794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return inserted;
29894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
29994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
30094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
30194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
30294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Updates the count shown to the user corresponding to the number of entries added.
30394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
30494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries inserted so far
30594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
30694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void updateCount(Integer count) {
30794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setProgress(count);
30894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
30994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng}
310