CallDetailActivitypublic class CallDetailActivity extends android.app.ListActivity implements AdapterView.OnItemClickListenerDisplays the details of a specific call log entry. |
Fields Summary |
---|
private static final String | TAG | private android.widget.TextView | mCallType | private android.widget.ImageView | mCallTypeIcon | private android.widget.TextView | mCallTime | private android.widget.TextView | mCallDuration | private String | mNumber | android.view.LayoutInflater | mInflater | android.content.res.Resources | mResources | static final String[] | CALL_LOG_PROJECTION | static final int | DATE_COLUMN_INDEX | static final int | DURATION_COLUMN_INDEX | static final int | NUMBER_COLUMN_INDEX | static final int | CALL_TYPE_COLUMN_INDEX | static final String[] | PHONES_PROJECTION | static final int | COLUMN_INDEX_ID | static final int | COLUMN_INDEX_NAME | static final int | COLUMN_INDEX_TYPE | static final int | COLUMN_INDEX_LABEL | static final int | COLUMN_INDEX_NUMBER |
Methods Summary |
---|
private java.lang.String | formatDuration(long elapsedSeconds)
long minutes = 0;
long seconds = 0;
if (elapsedSeconds >= 60) {
minutes = elapsedSeconds / 60;
elapsedSeconds -= minutes * 60;
}
seconds = elapsedSeconds;
return getString(R.string.callDetailsDurationFormat, minutes, seconds);
| protected void | onCreate(android.os.Bundle icicle)
super.onCreate(icicle);
setContentView(R.layout.call_detail);
mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
mResources = getResources();
mCallType = (TextView) findViewById(R.id.type);
mCallTypeIcon = (ImageView) findViewById(R.id.icon);
mCallTime = (TextView) findViewById(R.id.time);
mCallDuration = (TextView) findViewById(R.id.duration);
getListView().setOnItemClickListener(this);
| public void | onItemClick(android.widget.AdapterView parent, android.view.View view, int position, long id)
// Handle passing action off to correct handler.
if (view.getTag() instanceof ViewEntry) {
ViewEntry entry = (ViewEntry) view.getTag();
if (entry.intent != null) {
startActivity(entry.intent);
}
}
| public boolean | onKeyDown(int keyCode, android.view.KeyEvent event)
switch (keyCode) {
case KeyEvent.KEYCODE_CALL: {
// Make sure phone isn't already busy before starting direct call
TelephonyManager tm = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
Uri.fromParts("tel", mNumber, null));
startActivity(callIntent);
return true;
}
}
}
return super.onKeyDown(keyCode, event);
| public void | onResume()
super.onResume();
updateData(getIntent().getData());
| private void | updateData(android.net.Uri callUri)Update user interface with details of given call.
ContentResolver resolver = getContentResolver();
Cursor callCursor = resolver.query(callUri, CALL_LOG_PROJECTION, null, null, null);
try {
if (callCursor != null && callCursor.moveToFirst()) {
// Read call log specifics
mNumber = callCursor.getString(NUMBER_COLUMN_INDEX);
long date = callCursor.getLong(DATE_COLUMN_INDEX);
long duration = callCursor.getLong(DURATION_COLUMN_INDEX);
int callType = callCursor.getInt(CALL_TYPE_COLUMN_INDEX);
// Pull out string in format [relative], [date]
CharSequence dateClause = DateUtils.formatDateRange(this, date, date,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR);
mCallTime.setText(dateClause);
// Set the duration
if (callType == Calls.MISSED_TYPE) {
mCallDuration.setVisibility(View.GONE);
} else {
mCallDuration.setVisibility(View.VISIBLE);
mCallDuration.setText(formatDuration(duration));
}
// Set the call type icon and caption
String callText = null;
switch (callType) {
case Calls.INCOMING_TYPE:
mCallTypeIcon.setImageResource(R.drawable.ic_call_log_header_incoming_call);
mCallType.setText(R.string.type_incoming);
callText = getString(R.string.callBack);
break;
case Calls.OUTGOING_TYPE:
mCallTypeIcon.setImageResource(R.drawable.ic_call_log_header_outgoing_call);
mCallType.setText(R.string.type_outgoing);
callText = getString(R.string.callAgain);
break;
case Calls.MISSED_TYPE:
mCallTypeIcon.setImageResource(R.drawable.ic_call_log_header_missed_call);
mCallType.setText(R.string.type_missed);
callText = getString(R.string.returnCall);
break;
}
if (mNumber.equals(CallerInfo.UNKNOWN_NUMBER) ||
mNumber.equals(CallerInfo.PRIVATE_NUMBER)) {
// List is empty, let the empty view show instead.
TextView emptyText = (TextView) findViewById(R.id.emptyText);
if (emptyText != null) {
emptyText.setText(mNumber.equals(CallerInfo.PRIVATE_NUMBER)
? R.string.private_num : R.string.unknown);
}
} else {
// Perform a reverse-phonebook lookup to find the PERSON_ID
String callLabel = null;
Uri personUri = null;
Uri phoneUri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, Uri.encode(mNumber));
Cursor phonesCursor = resolver.query(phoneUri, PHONES_PROJECTION, null, null, null);
try {
if (phonesCursor != null && phonesCursor.moveToFirst()) {
long personId = phonesCursor.getLong(COLUMN_INDEX_ID);
personUri = ContentUris.withAppendedId(
Contacts.People.CONTENT_URI, personId);
callText = getString(R.string.recentCalls_callNumber,
phonesCursor.getString(COLUMN_INDEX_NAME));
mNumber = phonesCursor.getString(COLUMN_INDEX_NUMBER);
callLabel = Phones.getDisplayLabel(this,
phonesCursor.getInt(COLUMN_INDEX_TYPE),
phonesCursor.getString(COLUMN_INDEX_LABEL)).toString();
} else {
mNumber = PhoneNumberUtils.formatNumber(mNumber);
}
} finally {
if (phonesCursor != null) phonesCursor.close();
}
// Build list of various available actions
List<ViewEntry> actions = new ArrayList<ViewEntry>();
Intent callIntent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
Uri.fromParts("tel", mNumber, null));
ViewEntry entry = new ViewEntry(android.R.drawable.sym_action_call, callText,
callIntent);
entry.number = mNumber;
entry.label = callLabel;
actions.add(entry);
Intent smsIntent = new Intent(Intent.ACTION_SENDTO,
Uri.fromParts("sms", mNumber, null));
actions.add(new ViewEntry(R.drawable.sym_action_sms,
getString(R.string.menu_sendTextMessage), smsIntent));
// Let user view contact details if they exist, otherwise add option
// to create new contact from this number.
if (personUri != null) {
Intent viewIntent = new Intent(Intent.ACTION_VIEW, personUri);
actions.add(new ViewEntry(R.drawable.sym_action_view_contact,
getString(R.string.menu_viewContact), viewIntent));
} else {
Intent createIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
createIntent.setType(People.CONTENT_ITEM_TYPE);
createIntent.putExtra(Insert.PHONE, mNumber);
actions.add(new ViewEntry(R.drawable.sym_action_add,
getString(R.string.recentCalls_addToContact), createIntent));
}
ViewAdapter adapter = new ViewAdapter(this, actions);
setListAdapter(adapter);
}
} else {
// Something went wrong reading in our primary data, so we're going to
// bail out and show error to users.
Toast.makeText(this, R.string.toast_call_detail_error,
Toast.LENGTH_SHORT).show();
finish();
}
} finally {
if (callCursor != null) {
callCursor.close();
}
}
|
|