FillCallLogTestActivity.java revision 87ba489564b25d4a64c9faaeafea46e2f72d8933
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;
2694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentValues;
2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.CursorLoader;
2894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.Loader;
2994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.database.Cursor;
3094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.AsyncTask;
3194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.Bundle;
3294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.os.RemoteException;
3394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.CallLog.Calls;
3487ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chenimport android.telecomm.Subscription;
3587ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chenimport android.telephony.TelephonyManager;
36ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.text.format.DateFormat;
3794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.util.Log;
3894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View;
3994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Button;
4094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.CheckBox;
41ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.DatePicker;
42838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunnimport android.widget.EditText;
4394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.ProgressBar;
44ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.RadioButton;
4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.TextView;
46ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport android.widget.TimePicker;
4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.Toast;
4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport com.android.dialer.tests.R;
5094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
51ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunnimport java.util.Calendar;
5287ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chenimport java.util.List;
5394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.Random;
5494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/**
5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Activity to add entries to the call log for testing.
5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */
5894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class FillCallLogTestActivity extends Activity {
5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final String TAG = "FillCallLogTestActivity";
6094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Identifier of the loader for querying the call log. */
6194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int CALLLOG_LOADER_ID = 1;
6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final Random RNG = new Random();
6494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int[] CALL_TYPES = new int[] {
6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.MISSED_TYPE,
6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    };
6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private TextView mNumberTextView;
6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private Button mAddButton;
7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ProgressBar mProgressBar;
7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private CheckBox mUseRandomNumbers;
72ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeIncoming;
73ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeMissed;
74ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mCallTypeOutgoing;
75ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationAllowed;
76ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationRestricted;
77ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationUnknown;
78ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private RadioButton mPresentationPayphone;
79ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mCallDate;
80ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mCallTime;
81ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private TextView mPhoneNumber;
82838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn    private EditText mOffset;
83ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
84ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallTimeHour;
85ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallTimeMinute;
86ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateYear;
87ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateMonth;
88ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int mCallDateDay;
8987ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen    private RadioButton mSubscription0;
9087ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen    private RadioButton mSubscription1;
9194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
9294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    @Override
9394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    protected void onCreate(Bundle savedInstanceState) {
9494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        super.onCreate(savedInstanceState);
9594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        setContentView(R.layout.fill_call_log_test);
9694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView = (TextView) findViewById(R.id.number);
9794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton = (Button) findViewById(R.id.add);
9894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar = (ProgressBar) findViewById(R.id.progress);
9994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mUseRandomNumbers = (CheckBox) findViewById(R.id.use_random_numbers);
10094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
10194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setOnClickListener(new View.OnClickListener(){
10294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            @Override
10394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            public void onClick(View v) {
10494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                int count;
10594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    count = Integer.parseInt(mNumberTextView.getText().toString());
10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (count > 100) {
10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        throw new RuntimeException("Number too large.  Max=100");
10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RuntimeException e) {
11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Toast.makeText(FillCallLogTestActivity.this, e.toString(), Toast.LENGTH_LONG)
11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                            .show();
11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                addEntriesToCallLog(count, mUseRandomNumbers.isChecked());
11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mNumberTextView.setEnabled(false);
11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mAddButton.setEnabled(false);
11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setProgress(0);
11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setMax(count);
12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                mProgressBar.setVisibility(View.VISIBLE);
12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        });
123ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
124ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeIncoming = (RadioButton) findViewById(R.id.call_type_incoming);
125ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeMissed = (RadioButton) findViewById(R.id.call_type_missed);
126ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTypeOutgoing = (RadioButton) findViewById(R.id.call_type_outgoing);
127ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationAllowed = (RadioButton) findViewById(R.id.presentation_allowed);
128ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationPayphone = (RadioButton) findViewById(R.id.presentation_payphone);
129ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationUnknown = (RadioButton) findViewById(R.id.presentation_unknown);
130ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPresentationRestricted = (RadioButton) findViewById(R.id.presentation_restricted);
131ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTime = (TextView) findViewById(R.id.call_time);
132ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDate = (TextView) findViewById(R.id.call_date);
133ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mPhoneNumber = (TextView) findViewById(R.id.phone_number);
134838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mOffset = (EditText) findViewById(R.id.delta_after_add);
13587ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        mSubscription0 = (RadioButton) findViewById(R.id.subscription0);
13687ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        mSubscription1 = (RadioButton) findViewById(R.id.subscription1);
137ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
138ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        // Use the current time as the default values for the picker
139ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        final Calendar c = Calendar.getInstance();
140ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTimeHour = c.get(Calendar.HOUR_OF_DAY);
141ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTimeMinute = c.get(Calendar.MINUTE);
142ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateYear = c.get(Calendar.YEAR);
143ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateMonth = c.get(Calendar.MONTH);
144ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDateDay = c.get(Calendar.DAY_OF_MONTH);
145ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        setDisplayDate();
146ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        setDisplayTime();
14794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
14894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
14994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
15094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Adds a number of entries to the call log. The content of the entries is based on existing
15194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * entries.
15294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
15394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries to add
15494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
15594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addEntriesToCallLog(final int count, boolean useRandomNumbers) {
15694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        if (useRandomNumbers) {
15794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            addRandomNumbers(count);
15894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        } else {
15994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            getLoaderManager().initLoader(CALLLOG_LOADER_ID, null,
16094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    new CallLogLoaderListener(count));
16194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
16294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
16394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
16494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
16594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Calls when the insertion has completed.
16694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
16794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param message the message to show in a toast to the user
16894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
16994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void insertCompleted(String message) {
17094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Hide the progress bar.
17194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setVisibility(View.GONE);
17294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Re-enable the add button.
17394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setEnabled(true);
17494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mAddButton.setEnabled(true);
17594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mNumberTextView.setText("");
17694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
17794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
17894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
17994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
18094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
18194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Creates a {@link ContentValues} object containing values corresponding to the given cursor.
18294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
18394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param cursor the cursor from which to get the values
18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @return a newly created content values object
18594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
18694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ContentValues createContentValuesFromCursor(Cursor cursor) {
18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues values = new ContentValues();
18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int column = 0; column < cursor.getColumnCount();
18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ++column) {
19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            String name = cursor.getColumnName(column);
19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            switch (cursor.getType(column)) {
19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_STRING:
19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getString(column));
19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_INTEGER:
19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getLong(column));
19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_FLOAT:
19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getDouble(column));
20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_BLOB:
20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(name, cursor.getBlob(column));
20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                case Cursor.FIELD_TYPE_NULL:
20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.putNull(name);
20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                default:
20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "Invalid value in cursor: " + cursor.getType(column));
20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    break;
21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return values;
21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void addRandomNumbers(int count) {
21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues[] values = new ContentValues[count];
21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (int i = 0; i < count; i++) {
21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i] = new ContentValues();
21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.NUMBER, generateRandomNumber());
220719a7adde25e0a717816b00668c16c3a1e3c5518Jay Shrauner            values[i].put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_ALLOWED);
22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DATE, System.currentTimeMillis()); // Will be randomized later
22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            values[i].put(Calls.DURATION, 1); // Will be overwritten later
22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        new AsyncCallLogInserter(values).execute(new Void[0]);
22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static String generateRandomNumber() {
22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return String.format("5%09d", RNG.nextInt(1000000000));
22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Invokes {@link AsyncCallLogInserter} when the call log has loaded. */
23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class CallLogLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert when done. */
23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final int mCount;
23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private CallLogLoaderListener(int count) {
23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mCount = count;
23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onCreateLoader");
24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return new CursorLoader(FillCallLogTestActivity.this, Calls.CONTENT_URI,
24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    null, null, null, null);
24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            try {
25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                Log.d(TAG, "onLoadFinished");
25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (data.getCount() == 0) {
25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    // If there are no entries in the call log, we cannot generate new ones.
25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    insertCompleted(getString(R.string.noLogEntriesToast));
25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    return;
25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                data.moveToPosition(-1);
25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
26094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues[] values = new ContentValues[mCount];
26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                for (int index = 0; index < mCount; ++index) {
26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    if (!data.moveToNext()) {
26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        data.moveToFirst();
26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    }
26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values[index] = createContentValuesFromCursor(data);
26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                new AsyncCallLogInserter(values).execute(new Void[0]);
26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            } finally {
26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // This is a one shot loader.
27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                getLoaderManager().destroyLoader(CALLLOG_LOADER_ID);
27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
27394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
27594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public void onLoaderReset(Loader<Cursor> loader) {}
27694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
27794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Inserts a given number of entries in the call log based on the values given. */
27994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private final class AsyncCallLogInserter extends AsyncTask<Void, Integer, Integer> {
28094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /** The number of items to insert. */
28194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private final ContentValues[] mValues;
28294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        public AsyncCallLogInserter(ContentValues[] values) {
28494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            mValues = values;
28594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
28694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
28794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
28894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected Integer doInBackground(Void... params) {
28994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "doInBackground");
29094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return insertIntoCallLog();
29194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
29294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
29394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
29494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onProgressUpdate(Integer... values) {
29594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onProgressUpdate");
29694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            updateCount(values[0]);
29794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
29894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
29994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        @Override
30094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        protected void onPostExecute(Integer count) {
30194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Log.d(TAG, "onPostExecute");
30294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            insertCompleted(getString(R.string.addedLogEntriesToast, count));
30394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
30494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
30594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        /**
30694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * Inserts a number of entries in the call log based on the given templates.
30794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         *
30894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         * @return the number of inserted entries
30994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng         */
31094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        private Integer insertIntoCallLog() {
31194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int inserted = 0;
31294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
31394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            for (int index = 0; index < mValues.length; ++index) {
31494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentValues values = mValues[index];
31594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // These should not be set.
31694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls._ID);
31794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the date. For each new entry being added, add an extra
31894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // day to the maximum possible offset from the original.
31994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.DATE,
32094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        values.getAsLong(Calls.DATE)
32194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        - RNG.nextInt(24 * 60 * 60 * (index + 1)) * 1000L);
32294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Add some randomness to the duration.
32394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                if (values.getAsLong(Calls.DURATION) > 0) {
32494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    values.put(Calls.DURATION, RNG.nextInt(30 * 60 * 60 * 1000));
32594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
32694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
32794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Overwrite type.
32894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.put(Calls.TYPE, CALL_TYPES[RNG.nextInt(CALL_TYPES.length)]);
32994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
33094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Clear cached columns.
33194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_FORMATTED_NUMBER);
33294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_LOOKUP_URI);
33394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_MATCHED_NUMBER);
33494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NAME);
33594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NORMALIZED_NUMBER);
33694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_LABEL);
33794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_NUMBER_TYPE);
33894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                values.putNull(Calls.CACHED_PHOTO_ID);
33994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
34094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                // Insert into the call log the newly generated entry.
34194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                ContentProviderClient contentProvider =
34294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                        getContentResolver().acquireContentProviderClient(
34394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                                Calls.CONTENT_URI);
34494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                try {
34594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "adding entry to call log");
34694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    contentProvider.insert(Calls.CONTENT_URI, values);
34794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    ++inserted;
34894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    this.publishProgress(inserted);
34994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                } catch (RemoteException e) {
35094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                    Log.d(TAG, "insert failed", e);
35194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                }
35294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
35394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            return inserted;
35494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
35594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
35694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
35794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /**
35894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * Updates the count shown to the user corresponding to the number of entries added.
35994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     *
36094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     * @param count the number of entries inserted so far
36194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng     */
36294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void updateCount(Integer count) {
36394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mProgressBar.setProgress(count);
36494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
365ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
366ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
367ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Determines the call type for a manually entered call.
368ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
369ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @return Call type.
370ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
371ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int getManualCallType() {
372ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        if (mCallTypeIncoming.isChecked()) {
373ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.INCOMING_TYPE;
374ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mCallTypeOutgoing.isChecked()) {
375ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.OUTGOING_TYPE;
376ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else {
377ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.MISSED_TYPE;
378ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
379ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
380ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
381ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
382ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Determines the presentation for a manually entered call.
383ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
384ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @return Presentation.
385ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
386ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private int getManualPresentation() {
387ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        if (mPresentationAllowed.isChecked()) {
388ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_ALLOWED;
389ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mPresentationPayphone.isChecked()) {
390ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_PAYPHONE;
391ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else if (mPresentationRestricted.isChecked()) {
392ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_RESTRICTED;
393ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        } else {
394ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return Calls.PRESENTATION_UNKNOWN;
395ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
396ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
397ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
39887ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen    private Subscription getManualSubscription() {
39987ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        TelephonyManager telephonyManager = new TelephonyManager(this);
40087ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        List <Subscription> subscriptions = telephonyManager.getSubscriptions();
40187ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        if (mSubscription0.isChecked()) {
40287ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen            return subscriptions.get(0);
40387ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        } else if (mSubscription1.isChecked()){
40487ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen            return subscriptions.get(1);
40587ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        } else {
40687ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen            return null;
40787ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen        }
40887ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen    }
40987ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen
410ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
411ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Shows a time picker dialog, storing the results in the time field.
412ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
413ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void showTimePickerDialog(View v) {
414ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        DialogFragment newFragment = new TimePickerFragment();
415ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        newFragment.show(getFragmentManager(),"timePicker");
416ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
417ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
418ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
419ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Helper class to display time picker and store the hour/minute.
420ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
421ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public class TimePickerFragment extends DialogFragment
422ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            implements TimePickerDialog.OnTimeSetListener {
423ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
424ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        @Override
425ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public Dialog onCreateDialog(Bundle savedInstanceState) {
426ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            // Create a new instance of TimePickerDialog and return it
427ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return new TimePickerDialog(getActivity(), this, mCallTimeHour, mCallTimeMinute,
428ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                    DateFormat.is24HourFormat(getActivity()));
429ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
430ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
431ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
432ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallTimeHour = hourOfDay;
433ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallTimeMinute = minute;
434ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            setDisplayTime();
435ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
436ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
437ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
438ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
439ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Sets the call time TextView to the current selected time.
440ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
441ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private void setDisplayTime() {
442ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallTime.setText(String.format("%02d:%02d", mCallTimeHour, mCallTimeMinute));
443ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
444ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
445ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
446ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Sets the call date Textview to the current selected date
447ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
448ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    private void setDisplayDate() {
449ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        mCallDate.setText(String.format("%04d-%02d-%02d", mCallDateYear, mCallDateMonth,
450ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                mCallDateDay));
451ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
452ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
453ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
454ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Shows a date picker dialog.
455ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
456ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void showDatePickerDialog(View v) {
457ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        DialogFragment newFragment = new DatePickerFragment();
458ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        newFragment.show(getFragmentManager(),"datePicker");
459ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
460ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
461ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
462ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * Helper class to show a date picker.
463ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
464ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public class DatePickerFragment extends DialogFragment
465ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            implements DatePickerDialog.OnDateSetListener {
466ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
467ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        @Override
468ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public Dialog onCreateDialog(Bundle savedInstanceState) {
469ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            // Create a new instance of DatePickerDialog and return it
470ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            return new DatePickerDialog(getActivity(), this, mCallDateYear, mCallDateMonth,
471ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn                    mCallDateDay);
472ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
473ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
474ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        public void onDateSet(DatePicker view, int year, int month, int day) {
475ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateYear = year;
476ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateMonth = month;
477ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            mCallDateDay = day;
478ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn            setDisplayDate();
479ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        }
480ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
481ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
482ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    /**
483ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * OnClick handler for the button that adds a manual call log entry to the call log.
484ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     *
485ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     * @param v Calling view.
486ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn     */
487ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    public void addManualEntry(View v) {
488ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        Calendar dateTime = Calendar.getInstance();
489ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        dateTime.set(mCallDateYear, mCallDateMonth, mCallDateDay, mCallTimeHour, mCallTimeMinute);
490ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
491ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn        Calls.addCall(null, this, mPhoneNumber.getText().toString(), getManualPresentation(),
49287ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen                getManualCallType(), getManualSubscription(), dateTime.getTimeInMillis(),
49387ba489564b25d4a64c9faaeafea46e2f72d8933Nancy Chen                RNG.nextInt(60 * 60));
494ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn
495838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        // Subtract offset from the call date/time and store as new date/time
496838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        int offset = Integer.parseInt(mOffset.getText().toString());
497838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn
498838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        dateTime.add(Calendar.MINUTE, offset);
499838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateYear = dateTime.get(Calendar.YEAR);
500838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateMonth = dateTime.get(Calendar.MONTH);
501838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallDateDay = dateTime.get(Calendar.DAY_OF_MONTH);
502838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallTimeHour = dateTime.get(Calendar.HOUR_OF_DAY);
503838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        mCallTimeMinute = dateTime.get(Calendar.MINUTE);
504838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        setDisplayDate();
505838fe3f3dee69db20a978f43f2b3bec987527664Tyler Gunn        setDisplayTime();
506ebba68a0da51fa58c93e12df8557b65a2fb37f24Tyler Gunn    }
50794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng}
508