summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2014-11-14 14:39:07 +0100
committerGerrit Code Review <gerrit@cyanogenmod.org>2014-11-17 13:59:22 +0000
commit0dfccc8f8aef9b720c2896e19b6cae977fe2decb (patch)
treef1a727c68d8635316078d25f6bd384100b3038a5 /src
parent315d9119f681048974e03080bca69290b73c9914 (diff)
downloadandroid_packages_apps_Dialer-0dfccc8f8aef9b720c2896e19b6cae977fe2decb.tar.gz
android_packages_apps_Dialer-0dfccc8f8aef9b720c2896e19b6cae977fe2decb.tar.bz2
android_packages_apps_Dialer-0dfccc8f8aef9b720c2896e19b6cae977fe2decb.zip
Fix up call stats code.
The details view still needs more visual overhaul, but at least it _works_ now. Change-Id: I97f62c77d032de08f33d7ba76478008719e56ef1
Diffstat (limited to 'src')
-rwxr-xr-xsrc/com/android/dialer/CallDetailActivity.java36
-rw-r--r--src/com/android/dialer/CallDetailHeader.java346
-rwxr-xr-xsrc/com/android/dialer/PhoneCallDetails.java12
-rw-r--r--src/com/android/dialer/callstats/CallStatsAdapter.java33
-rw-r--r--src/com/android/dialer/callstats/CallStatsDetailActivity.java17
-rw-r--r--src/com/android/dialer/callstats/CallStatsDetails.java12
-rw-r--r--src/com/android/dialer/callstats/CallStatsFragment.java59
-rw-r--r--src/com/android/dialer/widget/AnchoredScrollView.java101
-rw-r--r--src/com/android/dialer/widget/PieChartView.java116
9 files changed, 168 insertions, 564 deletions
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 2d332851c..59932a85f 100755
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -16,7 +16,6 @@
package com.android.dialer;
-import android.accounts.Account;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.ContentUris;
@@ -41,8 +40,6 @@ import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import android.text.BidiFormatter;
-import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
@@ -52,19 +49,17 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
-import android.widget.QuickContactBadge;
import android.widget.TextView;
import android.widget.Toast;
-import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.CallUtil;
-import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.MoreContactUtils;
import com.android.dialer.calllog.CallDetailHistoryAdapter;
import com.android.dialer.calllog.CallTypeHelper;
import com.android.dialer.calllog.ContactInfo;
import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.contacts.common.ContactPhotoManager;
import com.android.dialer.calllog.PhoneAccountUtils;
import com.android.dialer.calllog.PhoneNumberDisplayHelper;
import com.android.dialer.calllog.PhoneNumberUtilsWrapper;
@@ -119,10 +114,6 @@ public class CallDetailActivity extends AnalyticsActivity implements ProximitySe
private CallDetailHeader mCallDetailHeader;
private CallTypeHelper mCallTypeHelper;
private PhoneNumberDisplayHelper mPhoneNumberHelper;
- private QuickContactBadge mQuickContactBadge;
- private TextView mCallerName;
- private TextView mCallerNumber;
- private TextView mAccountLabel;
private AsyncTaskExecutor mAsyncTaskExecutor;
private ContactInfoHelper mContactInfoHelper;
@@ -143,7 +134,6 @@ public class CallDetailActivity extends AnalyticsActivity implements ProximitySe
private LinearLayout mVoicemailHeader;
private Uri mVoicemailUri;
- private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
/** Whether we should show "edit number before call" in the options menu. */
private boolean mHasEditNumberBeforeCallOption;
@@ -261,11 +251,6 @@ public class CallDetailActivity extends AnalyticsActivity implements ProximitySe
mVoicemailUri = getIntent().getParcelableExtra(EXTRA_VOICEMAIL_URI);
- mQuickContactBadge = (QuickContactBadge) findViewById(R.id.quick_contact_photo);
- mQuickContactBadge.setOverlay(null);
- mCallerName = (TextView) findViewById(R.id.caller_name);
- mCallerNumber = (TextView) findViewById(R.id.caller_number);
- mAccountLabel = (TextView) findViewById(R.id.phone_account_label);
mDefaultCountryIso = GeoUtil.getCurrentCountryIso(this);
mProximitySensorManager = new ProximitySensorManager(this, mProximitySensorListener);
mContactInfoHelper = new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this));
@@ -437,7 +422,7 @@ public class CallDetailActivity extends AnalyticsActivity implements ProximitySe
mNumber = firstDetails.number.toString();
final int numberPresentation = firstDetails.numberPresentation;
// Set the details header, based on the first phone call.
- mCallDetailHeader.updateViews(mNumber, numberPresentation, firstDetails);
+ mCallDetailHeader.updateViews(firstDetails);
// Cache the details about the phone number.
final boolean canPlaceCallsTo =
@@ -446,16 +431,29 @@ public class CallDetailActivity extends AnalyticsActivity implements ProximitySe
final boolean isVoicemailNumber = phoneUtils.isVoicemailNumber(mNumber);
final boolean isSipNumber = phoneUtils.isSipNumber(mNumber);
- mHasEditNumberBeforeCallOption = mCallDetailHeader.canEditNumberBeforeCall();
+ mHasEditNumberBeforeCallOption =
+ canPlaceCallsTo && !isSipNumber && !isVoicemailNumber;
mHasTrashOption = hasVoicemail();
mHasRemoveFromCallLogOption = !hasVoicemail();
invalidateOptionsMenu();
+ if (hasVoicemail() && !TextUtils.isEmpty(firstDetails.transcription)) {
+ mVoicemailTranscription.setText(firstDetails.transcription);
+ mVoicemailTranscription.setVisibility(View.VISIBLE);
+ }
+
+ final boolean isBusiness = mContactInfoHelper.isBusiness(firstDetails.sourceType);
+
+ final int contactType =
+ isVoicemailNumber? ContactPhotoManager.TYPE_VOICEMAIL :
+ isBusiness ? ContactPhotoManager.TYPE_BUSINESS :
+ ContactPhotoManager.TYPE_DEFAULT;
+
ListView historyList = (ListView) findViewById(R.id.history);
historyList.setAdapter(
new CallDetailHistoryAdapter(CallDetailActivity.this, mInflater,
mCallTypeHelper, details));
- mCallDetailHeader.loadContactPhotos(firstDetails.photoUri);
+ mCallDetailHeader.loadContactPhotos(firstDetails, contactType);
findViewById(R.id.call_detail).setVisibility(View.VISIBLE);
}
diff --git a/src/com/android/dialer/CallDetailHeader.java b/src/com/android/dialer/CallDetailHeader.java
index 70ef60ae2..50b1f5927 100644
--- a/src/com/android/dialer/CallDetailHeader.java
+++ b/src/com/android/dialer/CallDetailHeader.java
@@ -16,33 +16,40 @@
package com.android.dialer;
+import android.accounts.Account;
import android.app.Activity;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.Contacts.Intents.Insert;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.RawContacts;
import android.telecom.PhoneAccount;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
import android.view.ActionMode;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.widget.ImageButton;
-import android.widget.ImageView;
+import android.widget.QuickContactBadge;
import android.widget.TextView;
import com.android.contacts.common.CallUtil;
import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.format.FormatUtils;
import com.android.contacts.common.util.Constants;
+import com.android.dialer.calllog.ContactInfoHelper;
import com.android.dialer.calllog.PhoneNumberDisplayHelper;
import com.android.dialer.calllog.PhoneNumberUtilsWrapper;
@@ -54,14 +61,14 @@ public class CallDetailHeader {
private Resources mResources;
private PhoneNumberDisplayHelper mPhoneNumberHelper;
private ContactPhotoManager mContactPhotoManager;
+ private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
private String mNumber;
- private TextView mHeaderTextView;
- private View mHeaderOverlayView;
- private ImageView mMainActionView;
- private ImageButton mMainActionPushLayerView;
- private ImageView mContactBackgroundView;
+ private TextView mCallerName;
+ private TextView mCallerNumber;
+ private TextView mAccountLabel;
+ private QuickContactBadge mQuickContactBadge;
private ActionMode mPhoneNumberActionMode;
private boolean mHasEditNumberBeforeCallOption;
@@ -78,255 +85,110 @@ public class CallDetailHeader {
CharSequence getNumberLabel();
CharSequence getFormattedNumber();
Uri getContactUri();
+ Uri getPhotoUri();
+ CharSequence getAccountLabel();
+ CharSequence getGeocode();
}
- private final View.OnClickListener mPrimaryActionListener = new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (finishPhoneNumerSelectedActionModeIfShown()) {
- return;
- }
- mActivity.startActivity(((ViewEntry) view.getTag()).primaryIntent);
- }
- };
-
- private final View.OnClickListener mSecondaryActionListener = new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (finishPhoneNumerSelectedActionModeIfShown()) {
- return;
- }
- mActivity.startActivity(((ViewEntry) view.getTag()).secondaryIntent);
- }
- };
-
- private final View.OnLongClickListener mPrimaryLongClickListener =
- new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- if (finishPhoneNumerSelectedActionModeIfShown()) {
- return true;
- }
- startPhoneNumberSelectedActionMode(v);
- return true;
- }
- };
-
public CallDetailHeader(Activity activity, PhoneNumberDisplayHelper phoneNumberHelper) {
mActivity = activity;
mResources = activity.getResources();
mPhoneNumberHelper = phoneNumberHelper;
mContactPhotoManager = ContactPhotoManager.getInstance(activity);
- mHeaderTextView = (TextView) activity.findViewById(R.id.header_text);
- mHeaderOverlayView = activity.findViewById(R.id.photo_text_bar);
- mMainActionView = (ImageView) activity.findViewById(R.id.main_action);
- mMainActionPushLayerView = (ImageButton) activity.findViewById(R.id.main_action_push_layer);
- mContactBackgroundView = (ImageView) activity.findViewById(R.id.contact_background);
- }
-
- /**
- * If the phone number is selected, unselect it and return {@code true}.
- * Otherwise, just {@code false}.
- */
- private boolean finishPhoneNumerSelectedActionModeIfShown() {
- if (mPhoneNumberActionMode == null) return false;
- mPhoneNumberActionMode.finish();
- return true;
- }
-
- private void startPhoneNumberSelectedActionMode(View targetView) {
- mPhoneNumberActionMode =
- mActivity.startActionMode(new PhoneNumberActionModeCallback(targetView));
- }
-
- private class PhoneNumberActionModeCallback implements ActionMode.Callback {
- private final View mTargetView;
- private final Drawable mOriginalViewBackground;
- public PhoneNumberActionModeCallback(View targetView) {
- mTargetView = targetView;
-
- // Highlight the phone number view. Remember the old background, and put a new one.
- mOriginalViewBackground = mTargetView.getBackground();
- mTargetView.setBackgroundColor(mResources.getColor(R.color.item_selected));
- }
-
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- if (TextUtils.isEmpty(mPhoneNumberToCopy)) return false;
-
- mActivity.getMenuInflater().inflate(R.menu.call_details_cab, menu);
- return true;
- }
-
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- return true;
- }
-
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- switch (item.getItemId()) {
- case R.id.copy_phone_number:
- ClipboardUtils.copyText(mActivity, mPhoneNumberLabelToCopy,
- mPhoneNumberToCopy, true);
- mode.finish(); // Close the CAB
- return true;
- }
- return false;
- }
-
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- mPhoneNumberActionMode = null;
-
- // Restore the view background.
- mTargetView.setBackground(mOriginalViewBackground);
- }
+ mCallerName = (TextView) activity.findViewById(R.id.caller_name);
+ mCallerNumber = (TextView) activity.findViewById(R.id.caller_number);
+ mAccountLabel = (TextView) activity.findViewById(R.id.phone_account_label);
+ mQuickContactBadge = (QuickContactBadge) activity.findViewById(R.id.quick_contact_photo);
+ mQuickContactBadge.setOverlay(null);
}
- public void updateViews(String number, int numberPresentation, Data data) {
+ public void updateViews(Data data) {
// Cache the details about the phone number.
final PhoneNumberUtilsWrapper phoneUtils = new PhoneNumberUtilsWrapper();
- final boolean isVoicemailNumber = phoneUtils.isVoicemailNumber(number);
- final boolean isSipNumber = phoneUtils.isSipNumber(number);
-
final CharSequence dataName = data.getName();
final CharSequence dataNumber = data.getNumber();
- final Uri contactUri = data.getContactUri();
+ final CharSequence dataAccount = data.getAccountLabel();
+ final CharSequence callLocationOrType = getNumberTypeOrLocation(data);
- mNumber = number;
- mCanPlaceCallsTo = PhoneNumberUtilsWrapper.canPlaceCallsTo(number, numberPresentation);
+ final CharSequence displayNumber = mPhoneNumberHelper.getDisplayNumber(
+ dataNumber, data.getNumberPresentation(), data.getFormattedNumber());
+ final String displayNumberStr = mBidiFormatter.unicodeWrap(
+ displayNumber.toString(), TextDirectionHeuristics.LTR);
- // Let user view contact details if they exist, otherwise add option to create new
- // contact from this number.
- final Intent mainActionIntent;
- final int mainActionIcon;
- final String mainActionDescription;
-
- final CharSequence nameOrNumber;
if (!TextUtils.isEmpty(dataName)) {
- nameOrNumber = dataName;
+ mCallerName.setText(dataName);
+ mCallerNumber.setText(callLocationOrType + " " + displayNumberStr);
} else {
- nameOrNumber = dataNumber;
+ mCallerName.setText(displayNumberStr);
+ if (!TextUtils.isEmpty(callLocationOrType)) {
+ mCallerNumber.setText(callLocationOrType);
+ mCallerNumber.setVisibility(View.VISIBLE);
+ } else {
+ mCallerNumber.setVisibility(View.GONE);
+ }
}
- if (contactUri != null) {
- mainActionIntent = new Intent(Intent.ACTION_VIEW, contactUri);
- // This will launch People's detail contact screen, so we probably want to
- // treat it as a separate People task.
- mainActionIntent.setFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mainActionIcon = R.drawable.ic_contacts_holo_dark;
- mainActionDescription =
- mResources.getString(R.string.description_view_contact, nameOrNumber);
- } else if (isVoicemailNumber) {
- mainActionIntent = null;
- mainActionIcon = 0;
- mainActionDescription = null;
- } else if (isSipNumber) {
- // TODO: This item is currently disabled for SIP addresses, because
- // the Insert.PHONE extra only works correctly for PSTN numbers.
- //
- // To fix this for SIP addresses, we need to:
- // - define ContactsContract.Intents.Insert.SIP_ADDRESS, and use it here if
- // the current number is a SIP address
- // - update the contacts UI code to handle Insert.SIP_ADDRESS by
- // updating the SipAddress field
- // and then we can remove the "!isSipNumber" check above.
- mainActionIntent = null;
- mainActionIcon = 0;
- mainActionDescription = null;
- } else if (mCanPlaceCallsTo) {
- mainActionIntent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
- mainActionIntent.setType(Contacts.CONTENT_ITEM_TYPE);
- mainActionIntent.putExtra(Insert.PHONE, number);
- mainActionIcon = R.drawable.ic_add_contact_holo_dark;
- mainActionDescription = mResources.getString(R.string.description_add_contact);
+ if (!TextUtils.isEmpty(dataAccount)) {
+ mAccountLabel.setText(dataAccount);
+ mAccountLabel.setVisibility(View.VISIBLE);
} else {
- // If we cannot call the number, when we probably cannot add it as a contact either.
- // This is usually the case of private, unknown, or payphone numbers.
- mainActionIntent = null;
- mainActionIcon = 0;
- mainActionDescription = null;
+ mAccountLabel.setVisibility(View.GONE);
}
+ }
- if (mainActionIntent == null) {
- mMainActionView.setVisibility(View.INVISIBLE);
- mMainActionPushLayerView.setVisibility(View.GONE);
- mHeaderTextView.setVisibility(View.INVISIBLE);
- mHeaderOverlayView.setVisibility(View.INVISIBLE);
+ private CharSequence getNumberTypeOrLocation(Data data) {
+ if (!TextUtils.isEmpty(data.getName())) {
+ return Phone.getTypeLabel(mResources, data.getNumberType(),
+ data.getNumberLabel());
} else {
- mMainActionView.setVisibility(View.VISIBLE);
- mMainActionView.setImageResource(mainActionIcon);
- mMainActionPushLayerView.setVisibility(View.VISIBLE);
- mMainActionPushLayerView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mActivity.startActivity(mainActionIntent);
- }
- });
- mMainActionPushLayerView.setContentDescription(mainActionDescription);
- mHeaderTextView.setVisibility(View.VISIBLE);
- mHeaderOverlayView.setVisibility(View.VISIBLE);
+ return data.getGeocode();
}
+ }
- // This action allows to call the number that places the call.
- if (mCanPlaceCallsTo) {
- final CharSequence displayNumber =
- mPhoneNumberHelper.getDisplayNumber(
- dataNumber, data.getNumberPresentation(), data.getFormattedNumber());
-
- ViewEntry entry = new ViewEntry(
- mResources.getString(R.string.menu_callNumber,
- forceLeftToRight(displayNumber)),
- CallUtil.getCallIntent(number),
- mResources.getString(R.string.description_call, nameOrNumber));
-
- // Only show a label if the number is shown and it is not a SIP address.
- if (!TextUtils.isEmpty(dataName)
- && !TextUtils.isEmpty(dataNumber)
- && !PhoneNumberUtils.isUriNumber(dataNumber.toString())) {
- entry.label = Phone.getTypeLabel(mResources, data.getNumberType(),
- data.getNumberLabel());
+ /** Load the contact photos and places them in the corresponding views. */
+ public void loadContactPhotos(Data data, int contactType) {
+ Uri contactUri = data.getContactUri();
+ Account contactAccount = null;
+ if (contactUri != null) {
+ ContentResolver resolver = mActivity.getContentResolver();
+ Uri uri = Contacts.lookupContact(resolver, contactUri);
+ if (uri != null) {
+ Cursor cursor = resolver.query(
+ uri,
+ new String[] { RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_NAME },
+ null, null, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ String accountType = cursor.getString(0);
+ String accountName = cursor.getString(1);
+ if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
+ contactAccount = new Account(accountName, accountType);
}
-
- // The secondary action allows to send an SMS to the number that placed the
- // call.
- if (phoneUtils.canSendSmsTo(number, numberPresentation)) {
- entry.setSecondaryAction(
- R.drawable.ic_text_holo_light,
- new Intent(Intent.ACTION_SENDTO,
- Uri.fromParts("sms", number, null)),
- mResources.getString(R.string.description_send_text_message, nameOrNumber));
+ cursor.close();
+ }
}
+ }
- configureCallButton(entry);
- mPhoneNumberToCopy = displayNumber;
- mPhoneNumberLabelToCopy = entry.label;
+ String nameForDefaultImage;
+ if (TextUtils.isEmpty(data.getName())) {
+ nameForDefaultImage = mPhoneNumberHelper.getDisplayNumber(data.getNumber(),
+ data.getNumberPresentation(), data.getFormattedNumber()).toString();
} else {
- disableCallButton();
- mPhoneNumberToCopy = null;
- mPhoneNumberLabelToCopy = null;
+ nameForDefaultImage = data.getName().toString();
}
- mHasEditNumberBeforeCallOption =
- mCanPlaceCallsTo && !isSipNumber && !isVoicemailNumber;
- }
-
- /** Load the contact photos and places them in the corresponding views. */
- public void loadContactPhotos(Uri photoUri) {
- mContactPhotoManager.loadPhoto(mContactBackgroundView, photoUri,
- null, mContactBackgroundView.getWidth(), false, true, null);
- }
+ String lookupKey = contactUri == null ? null
+ : ContactInfoHelper.getLookupKeyFromUri(contactUri);
+ final DefaultImageRequest request = new DefaultImageRequest(nameForDefaultImage,
+ lookupKey, contactType, true /* isCircular */);
- public boolean canEditNumberBeforeCall() {
- return mHasEditNumberBeforeCallOption;
- }
+ mQuickContactBadge.assignContactUri(contactUri);
+ mQuickContactBadge.setContentDescription(
+ mResources.getString(R.string.description_contact_details, data.getName()));
- public boolean canPlaceCallsTo() {
- return mCanPlaceCallsTo;
+ mContactPhotoManager.loadDirectoryPhoto(mQuickContactBadge, data.getPhotoUri(),
+ contactAccount, false /* darkTheme */, true /* isCircular */, request);
}
static final class ViewEntry {
@@ -356,48 +218,6 @@ public class CallDetailHeader {
}
}
- /** Disables the call button area, e.g., for private numbers. */
- private void disableCallButton() {
- mActivity.findViewById(R.id.call_and_sms).setVisibility(View.GONE);
- }
-
- /** Configures the call button area using the given entry. */
- private void configureCallButton(ViewEntry entry) {
- View convertView = mActivity.findViewById(R.id.call_and_sms);
- convertView.setVisibility(View.VISIBLE);
-
- ImageView icon = (ImageView) convertView.findViewById(R.id.call_and_sms_icon);
- View divider = convertView.findViewById(R.id.call_and_sms_divider);
- TextView text = (TextView) convertView.findViewById(R.id.call_and_sms_text);
-
- View mainAction = convertView.findViewById(R.id.call_and_sms_main_action);
- mainAction.setOnClickListener(mPrimaryActionListener);
- mainAction.setTag(entry);
- mainAction.setContentDescription(entry.primaryDescription);
- mainAction.setOnLongClickListener(mPrimaryLongClickListener);
-
- if (entry.secondaryIntent != null) {
- icon.setOnClickListener(mSecondaryActionListener);
- icon.setImageResource(entry.secondaryIcon);
- icon.setVisibility(View.VISIBLE);
- icon.setTag(entry);
- icon.setContentDescription(entry.secondaryDescription);
- divider.setVisibility(View.VISIBLE);
- } else {
- icon.setVisibility(View.GONE);
- divider.setVisibility(View.GONE);
- }
- text.setText(entry.text);
-
- TextView label = (TextView) convertView.findViewById(R.id.call_and_sms_label);
- if (TextUtils.isEmpty(entry.label)) {
- label.setVisibility(View.GONE);
- } else {
- label.setText(entry.label);
- label.setVisibility(View.VISIBLE);
- }
- }
-
public boolean handleKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_CALL: {
diff --git a/src/com/android/dialer/PhoneCallDetails.java b/src/com/android/dialer/PhoneCallDetails.java
index 6bc75a5d7..3d8304ef8 100755
--- a/src/com/android/dialer/PhoneCallDetails.java
+++ b/src/com/android/dialer/PhoneCallDetails.java
@@ -183,4 +183,16 @@ public class PhoneCallDetails implements CallDetailHeader.Data {
public Uri getContactUri() {
return contactUri;
}
+ @Override
+ public Uri getPhotoUri() {
+ return photoUri;
+ }
+ @Override
+ public CharSequence getAccountLabel() {
+ return accountLabel;
+ }
+ @Override
+ public CharSequence getGeocode() {
+ return geocode;
+ }
}
diff --git a/src/com/android/dialer/callstats/CallStatsAdapter.java b/src/com/android/dialer/callstats/CallStatsAdapter.java
index 82ddde78d..de9a71379 100644
--- a/src/com/android/dialer/callstats/CallStatsAdapter.java
+++ b/src/com/android/dialer/callstats/CallStatsAdapter.java
@@ -20,13 +20,15 @@ package com.android.dialer.callstats;
import android.content.Context;
import android.content.res.Resources;
import android.net.Uri;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
-import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.GeoUtil;
import com.android.dialer.R;
import com.android.dialer.calllog.CallLogAdapterHelper;
@@ -76,6 +78,7 @@ class CallStatsAdapter extends ArrayAdapter<CallStatsDetails>
private boolean mSortByDuration;
private final ContactPhotoManager mContactPhotoManager;
+ private PhoneNumberDisplayHelper mPhoneNumberHelper;
private final Comparator<CallStatsDetails> mDurationComparator = new Comparator<CallStatsDetails>() {
@Override
@@ -109,14 +112,14 @@ class CallStatsAdapter extends ArrayAdapter<CallStatsDetails>
mInfoLookup = new ConcurrentHashMap<ContactInfo, CallStatsDetails>();
Resources resources = mContext.getResources();
- PhoneNumberDisplayHelper phoneNumberHelper = new PhoneNumberDisplayHelper(resources);
+ mPhoneNumberHelper = new PhoneNumberDisplayHelper(resources);
final String currentCountryIso = GeoUtil.getCurrentCountryIso(mContext);
final ContactInfoHelper contactInfoHelper =
new ContactInfoHelper(mContext, currentCountryIso);
mAdapterHelper = new CallLogAdapterHelper(mContext, this,
- contactInfoHelper, phoneNumberHelper);
+ contactInfoHelper, mPhoneNumberHelper);
mContactPhotoManager = ContactPhotoManager.getInstance(mContext);
mCallStatsDetailHelper = new CallStatsDetailHelper(resources,
new PhoneNumberUtilsWrapper());
@@ -209,13 +212,20 @@ class CallStatsAdapter extends ArrayAdapter<CallStatsDetails>
final CallStatsDetails details = getItem(position);
final CallStatsDetails first = getItem(0);
- views.primaryActionView.setVisibility(View.VISIBLE);
views.primaryActionView.setTag(IntentProvider.getCallStatsDetailIntentProvider(
details, mFilterFrom, mFilterTo, mSortByDuration));
-
mCallStatsDetailHelper.setCallStatsDetails(views.callStatsDetailViews,
details, first, mTotalItem, mType, mSortByDuration);
- setPhoto(views, details.photoId, details.contactUri);
+
+ String nameForDefaultImage = null;
+ if (TextUtils.isEmpty(details.name)) {
+ nameForDefaultImage = mPhoneNumberHelper.getDisplayNumber(details.number,
+ details.numberPresentation, details.formattedNumber).toString();
+ } else {
+ nameForDefaultImage = details.name;
+ }
+
+ setPhoto(views, details.photoId, details.contactUri, nameForDefaultImage);
// Listen for the first draw
mAdapterHelper.registerOnPreDrawListener(v);
@@ -227,10 +237,17 @@ class CallStatsAdapter extends ArrayAdapter<CallStatsDetails>
view.setTag(views);
}
- private void setPhoto(CallStatsListItemViews views, long photoId, Uri contactUri) {
+ private void setPhoto(CallStatsListItemViews views, long photoId,
+ Uri contactUri, String displayName) {
views.quickContactView.assignContactUri(contactUri);
+ views.quickContactView.setOverlay(null);
+
+ String lookupKey = contactUri == null ? null
+ : ContactInfoHelper.getLookupKeyFromUri(contactUri);
+ DefaultImageRequest request = new DefaultImageRequest(displayName, lookupKey,
+ ContactPhotoManager.TYPE_DEFAULT, true /* isCircular */);
mContactPhotoManager.loadThumbnail(views.quickContactView, photoId, null,
- false, true, null, null);
+ false /* darkTheme */, true /* isCircular */, request);
}
@Override
diff --git a/src/com/android/dialer/callstats/CallStatsDetailActivity.java b/src/com/android/dialer/callstats/CallStatsDetailActivity.java
index dc64c2e74..2c3bcba91 100644
--- a/src/com/android/dialer/callstats/CallStatsDetailActivity.java
+++ b/src/com/android/dialer/callstats/CallStatsDetailActivity.java
@@ -32,9 +32,11 @@ import android.view.View;
import android.widget.TextView;
import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.GeoUtil;
import com.android.dialer.CallDetailHeader;
import com.android.dialer.R;
+import com.android.dialer.calllog.CallTypeIconsView;
import com.android.dialer.calllog.ContactInfo;
import com.android.dialer.calllog.ContactInfoHelper;
import com.android.dialer.calllog.PhoneNumberDisplayHelper;
@@ -112,6 +114,10 @@ public class CallStatsDetailActivity extends Activity {
mMissedCount = (TextView) findViewById(R.id.missed_count);
mPieChart = (PieChartView) findViewById(R.id.pie_chart);
+ setCallType(R.id.in_icon, Calls.INCOMING_TYPE);
+ setCallType(R.id.out_icon, Calls.OUTGOING_TYPE);
+ setCallType(R.id.missed_icon, Calls.MISSED_TYPE);
+
configureActionBar();
Intent launchIntent = getIntent();
mData = (CallStatsDetails) launchIntent.getParcelableExtra(EXTRA_DETAILS);
@@ -142,13 +148,18 @@ public class CallStatsDetailActivity extends Activity {
return super.onKeyDown(keyCode, event);
}
+ private void setCallType(int id, int type) {
+ CallTypeIconsView view = (CallTypeIconsView) findViewById(id);
+ view.add(type);
+ }
+
private void updateData() {
mNumber = mData.number.toString();
// Set the details header, based on the first phone call.
mCallStatsDetailHelper.setCallStatsDetailHeader(mHeaderTextView, mData);
- mCallDetailHeader.updateViews(mNumber, mData.numberPresentation, mData);
- mCallDetailHeader.loadContactPhotos(mData.photoUri);
+ mCallDetailHeader.updateViews(mData);
+ mCallDetailHeader.loadContactPhotos(mData, ContactPhotoManager.TYPE_DEFAULT);
invalidateOptionsMenu();
mPieChart.setOriginAngle(240);
@@ -230,8 +241,10 @@ public class CallStatsDetailActivity extends Activity {
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
+ /*
menu.findItem(R.id.menu_edit_number_before_call).setVisible(
mCallDetailHeader.canEditNumberBeforeCall());
+ */
return super.onPrepareOptionsMenu(menu);
}
diff --git a/src/com/android/dialer/callstats/CallStatsDetails.java b/src/com/android/dialer/callstats/CallStatsDetails.java
index 377b5149c..80c36ac65 100644
--- a/src/com/android/dialer/callstats/CallStatsDetails.java
+++ b/src/com/android/dialer/callstats/CallStatsDetails.java
@@ -91,6 +91,18 @@ public class CallStatsDetails implements CallDetailHeader.Data, Parcelable {
public Uri getContactUri() {
return contactUri;
}
+ @Override
+ public Uri getPhotoUri() {
+ return photoUri;
+ }
+ @Override
+ public CharSequence getAccountLabel() {
+ return null;
+ }
+ @Override
+ public CharSequence getGeocode() {
+ return geocode;
+ }
public void updateFromInfo(ContactInfo info) {
this.name = info.name;
diff --git a/src/com/android/dialer/callstats/CallStatsFragment.java b/src/com/android/dialer/callstats/CallStatsFragment.java
index 2abbae431..c67e746ba 100644
--- a/src/com/android/dialer/callstats/CallStatsFragment.java
+++ b/src/com/android/dialer/callstats/CallStatsFragment.java
@@ -17,21 +17,15 @@
package com.android.dialer.callstats;
-import android.app.ActionBar;
import android.app.ListFragment;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
import android.database.ContentObserver;
-import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.CallLog;
import android.provider.ContactsContract;
-import android.telecom.PhoneAccount;
-import android.telephony.PhoneNumberUtils;
import android.text.format.DateUtils;
-import android.text.TextUtils;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -41,20 +35,13 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
-import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
-import com.android.contacts.common.CallUtil;
-import com.android.contacts.common.util.Constants;
-import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
import com.android.dialer.calllog.ContactInfo;
-import com.android.dialer.calllog.PhoneNumberUtilsWrapper;
import com.android.dialer.widget.DoubleDatePickerDialog;
-import com.android.internal.telephony.CallerInfo;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -63,13 +50,6 @@ public class CallStatsFragment extends ListFragment implements
AdapterView.OnItemSelectedListener, DoubleDatePickerDialog.OnDateSetListener {
private static final String TAG = "CallStatsFragment";
- private static final int[] CALL_DIRECTION_RESOURCES = new int[] {
- R.drawable.ic_call_inout_holo_dark,
- R.drawable.ic_call_incoming_holo_dark,
- R.drawable.ic_call_outgoing_holo_dark,
- R.drawable.ic_call_missed_holo_dark
- };
-
private Spinner mFilterSpinner;
private int mCallTypeFilter = CallStatsQueryHandler.CALL_TYPE_ALL;
@@ -122,9 +102,6 @@ public class CallStatsFragment extends ListFragment implements
TextView label = (TextView) convertView.findViewById(R.id.call_stats_nav_text);
label.setText(getItem(position));
- ImageView icon = (ImageView) convertView.findViewById(R.id.call_stats_nav_icon);
- icon.setImageResource(CALL_DIRECTION_RESOURCES[position]);
-
return convertView;
}
}
@@ -155,6 +132,7 @@ public class CallStatsFragment extends ListFragment implements
mAdapter = new CallStatsAdapter(getActivity(), this);
setListAdapter(mAdapter);
getListView().setItemsCanFocus(true);
+ getListView().setEmptyView(view.findViewById(R.id.empty_list_view));
}
@Override
@@ -297,41 +275,6 @@ public class CallStatsFragment extends ListFragment implements
getView().findViewById(R.id.call_stats_header).setVisibility(View.VISIBLE);
}
- public void callSelectedEntry() {
- int position = getListView().getSelectedItemPosition();
- if (position < 0) {
- // In touch mode you may often not have something selected, so
- // just call the first entry to make sure that [send] calls
- // the most recent entry.
- position = 0;
- }
- final CallStatsDetails item = mAdapter.getItem(position);
- String number = (String) item.number;
-
- if (!PhoneNumberUtilsWrapper.canPlaceCallsTo(number, item.numberPresentation)) {
- // This number can't be called, do nothing
- return;
- }
-
- Uri callUri;
- // If "number" is really a SIP address, construct a sip: URI.
- if (PhoneNumberUtils.isUriNumber(number)) {
- callUri = Uri.fromParts(PhoneAccount.SCHEME_SIP, number, null);
- } else {
- if (!number.startsWith("+")) {
- // If the caller-id matches a contact with a better qualified
- // number, use it
- number = mAdapter.getBetterNumberFromContacts(number, item.countryIso);
- }
- callUri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
- }
-
- final Intent intent = CallUtil.getCallIntent(callUri);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- startActivity(intent);
- }
-
/** Requests updates to the data to be shown. */
private void refreshData() {
// Prevent unnecessary refresh.
diff --git a/src/com/android/dialer/widget/AnchoredScrollView.java b/src/com/android/dialer/widget/AnchoredScrollView.java
deleted file mode 100644
index a07b8f798..000000000
--- a/src/com/android/dialer/widget/AnchoredScrollView.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2013 The CyanogenMod Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dialer.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ScrollView;
-
-import com.android.dialer.R;
-
-/**
- * A ScrollView that makes sure that the part of the 'anchored' view
- * that is defined by the anchor is never scrolled out of view.
- */
-public class AnchoredScrollView extends ScrollView {
- private int mAnchorId;
- private int mAnchoredId;
- private boolean mAnchorAtBottom;
-
- private View mAnchorView;
- private View mAnchoredView;
- private int mOrigAnchoredTop;
-
- public AnchoredScrollView(Context context) {
- this(context, null);
- }
-
- public AnchoredScrollView(Context context, AttributeSet attrs) {
- this(context, attrs, com.android.internal.R.attr.scrollViewStyle);
- }
-
- public AnchoredScrollView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a =
- context.obtainStyledAttributes(attrs, R.styleable.AnchoredScrollView);
-
- mAnchorId = a.getResourceId(R.styleable.AnchoredScrollView_anchorView, 0);
- mAnchoredId = a.getResourceId(R.styleable.AnchoredScrollView_anchoredView, 0);
- mAnchorAtBottom = a.getBoolean(R.styleable.AnchoredScrollView_anchorAtBottom, false);
-
- a.recycle();
- }
-
- private boolean ensureViews() {
- if (mAnchorView == null) {
- mAnchorView = findViewTraversal(mAnchorId);
- }
- if (mAnchoredView == null) {
- mAnchoredView = findViewTraversal(mAnchoredId);
- }
-
- return mAnchorView != null && mAnchoredView != null;
- }
-
- private int getAnchor() {
- return mAnchorAtBottom ? mAnchorView.getBottom() : mAnchorView.getTop();
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- super.onLayout(changed, l, t, r, b);
- if (ensureViews()) {
- mOrigAnchoredTop = mAnchoredView.getTop();
- }
- }
-
- @Override
- protected void onScrollChanged(int l, int t, int oldl, int oldt) {
- super.onScrollChanged(l, t, oldl, oldt);
-
- if (!ensureViews()) {
- return;
- }
-
- int currentOffset = mAnchoredView.getTop() - mOrigAnchoredTop;
- int matchDistance = getAnchor() - getScrollY();
- int desiredOffset = Math.max(-matchDistance, 0);
- int neededOffset = desiredOffset - currentOffset;
-
- if (neededOffset != 0) {
- mAnchoredView.offsetTopAndBottom(neededOffset);
- }
- }
-}
diff --git a/src/com/android/dialer/widget/PieChartView.java b/src/com/android/dialer/widget/PieChartView.java
index 10df10da5..429b1695e 100644
--- a/src/com/android/dialer/widget/PieChartView.java
+++ b/src/com/android/dialer/widget/PieChartView.java
@@ -44,29 +44,14 @@ public class PieChartView extends View {
public static final String TAG = "PieChartView";
public static final boolean LOGD = false;
- private static final boolean FILL_GRADIENT = false;
-
private ArrayList<Slice> mSlices = Lists.newArrayList();
private int mOriginAngle;
private Matrix mMatrix = new Matrix();
- private Paint mPaintOutline = new Paint();
-
- private Path mPathSide = new Path();
- private Path mPathSideOutline = new Path();
-
- private Path mPathOutline = new Path();
-
- private int mSideWidth;
-
public class Slice {
public long value;
-
public Path path = new Path();
- public Path pathSide = new Path();
- public Path pathOutline = new Path();
-
public Paint paint;
public Slice(long value, int color) {
@@ -86,30 +71,6 @@ public class PieChartView extends View {
public PieChartView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.PieChartView, 0, 0);
- int n = a.getIndexCount();
- int outlineColor = 0;
-
- for (int i = 0; i < n; i++) {
- int attr = a.getIndex(i);
-
- switch (attr) {
- case R.styleable.PieChartView_outlineColor:
- outlineColor = a.getInt(attr, 0);
- break;
- }
- }
-
- a.recycle();
-
- mPaintOutline.setColor(outlineColor);
- mPaintOutline.setStyle(Style.STROKE);
- mPaintOutline.setStrokeWidth(3f * getResources().getDisplayMetrics().density);
- mPaintOutline.setAntiAlias(true);
-
- mSideWidth = (int) (20 * getResources().getDisplayMetrics().density);
-
setWillNotDraw(false);
}
@@ -120,11 +81,6 @@ public class PieChartView extends View {
paint.setStyle(Style.FILL_AND_STROKE);
paint.setAntiAlias(true);
- if (FILL_GRADIENT) {
- final int width = (int) (280 * res.getDisplayMetrics().density);
- paint.setShader(new RadialGradient(0, 0, width, color, darken(color), TileMode.MIRROR));
- }
-
return paint;
}
@@ -146,26 +102,18 @@ public class PieChartView extends View {
final float centerY = getHeight() / 2;
mMatrix.reset();
- mMatrix.postScale(0.665f, 0.95f, centerX, centerY);
- mMatrix.postRotate(-40, centerX, centerY);
+ mMatrix.postScale(0.95f, 0.95f, centerX, centerY);
generatePath();
}
public void generatePath() {
-
long total = 0;
for (Slice slice : mSlices) {
slice.path.reset();
- slice.pathSide.reset();
- slice.pathOutline.reset();
total += slice.value;
}
- mPathSide.reset();
- mPathSideOutline.reset();
- mPathOutline.reset();
-
// bail when not enough stats to render
if (total == 0) {
invalidate();
@@ -176,57 +124,16 @@ public class PieChartView extends View {
final int height = getHeight();
final RectF rect = new RectF(0, 0, width, height);
- final RectF rectSide = new RectF();
- rectSide.set(rect);
- rectSide.offset(-mSideWidth, 0);
- mPathSide.addOval(rectSide, Direction.CW);
- mPathSideOutline.addOval(rectSide, Direction.CW);
- mPathOutline.addOval(rect, Direction.CW);
-
- int startAngle = mOriginAngle;
+ float startAngle = mOriginAngle;
for (Slice slice : mSlices) {
- final int sweepAngle = (int) (slice.value * 360 / total);
- final int endAngle = startAngle + sweepAngle;
-
- final float startAngleMod = startAngle % 360;
- final float endAngleMod = endAngle % 360;
- final boolean startSideVisible = startAngleMod > 90 && startAngleMod < 270;
- final boolean endSideVisible = endAngleMod > 90 && endAngleMod < 270;
+ final float sweepAngle = 360f * slice.value / total;
// draw slice
slice.path.moveTo(rect.centerX(), rect.centerY());
slice.path.arcTo(rect, startAngle, sweepAngle);
slice.path.lineTo(rect.centerX(), rect.centerY());
- if (startSideVisible || endSideVisible) {
-
- // when start is beyond horizon, push until visible
- final float startAngleSide = startSideVisible ? startAngle : 450;
- final float endAngleSide = endSideVisible ? endAngle : 270;
- final float sweepAngleSide = endAngleSide - startAngleSide;
-
- // draw slice side
- slice.pathSide.moveTo(rect.centerX(), rect.centerY());
- slice.pathSide.arcTo(rect, startAngleSide, 0);
- slice.pathSide.rLineTo(-mSideWidth, 0);
- slice.pathSide.arcTo(rectSide, startAngleSide, sweepAngleSide);
- slice.pathSide.rLineTo(mSideWidth, 0);
- slice.pathSide.arcTo(rect, endAngleSide, -sweepAngleSide);
- }
-
- // draw slice outline
- slice.pathOutline.moveTo(rect.centerX(), rect.centerY());
- slice.pathOutline.arcTo(rect, startAngle, 0);
- if (startSideVisible) {
- slice.pathOutline.rLineTo(-mSideWidth, 0);
- }
- slice.pathOutline.moveTo(rect.centerX(), rect.centerY());
- slice.pathOutline.arcTo(rect, startAngle + sweepAngle, 0);
- if (endSideVisible) {
- slice.pathOutline.rLineTo(-mSideWidth, 0);
- }
-
startAngle += sweepAngle;
}
@@ -235,27 +142,10 @@ public class PieChartView extends View {
@Override
protected void onDraw(Canvas canvas) {
-
canvas.concat(mMatrix);
for (Slice slice : mSlices) {
- canvas.drawPath(slice.pathSide, slice.paint);
- }
- canvas.drawPath(mPathSideOutline, mPaintOutline);
-
- for (Slice slice : mSlices) {
canvas.drawPath(slice.path, slice.paint);
- canvas.drawPath(slice.pathOutline, mPaintOutline);
}
- canvas.drawPath(mPathOutline, mPaintOutline);
}
-
- public static int darken(int color) {
- float[] hsv = new float[3];
- Color.colorToHSV(color, hsv);
- hsv[2] /= 2;
- hsv[1] /= 2;
- return Color.HSVToColor(hsv);
- }
-
}