diff options
author | Danny Baumann <dannybaumann@web.de> | 2014-11-14 14:39:07 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2014-11-17 13:59:22 +0000 |
commit | 0dfccc8f8aef9b720c2896e19b6cae977fe2decb (patch) | |
tree | f1a727c68d8635316078d25f6bd384100b3038a5 /src | |
parent | 315d9119f681048974e03080bca69290b73c9914 (diff) | |
download | android_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-x | src/com/android/dialer/CallDetailActivity.java | 36 | ||||
-rw-r--r-- | src/com/android/dialer/CallDetailHeader.java | 346 | ||||
-rwxr-xr-x | src/com/android/dialer/PhoneCallDetails.java | 12 | ||||
-rw-r--r-- | src/com/android/dialer/callstats/CallStatsAdapter.java | 33 | ||||
-rw-r--r-- | src/com/android/dialer/callstats/CallStatsDetailActivity.java | 17 | ||||
-rw-r--r-- | src/com/android/dialer/callstats/CallStatsDetails.java | 12 | ||||
-rw-r--r-- | src/com/android/dialer/callstats/CallStatsFragment.java | 59 | ||||
-rw-r--r-- | src/com/android/dialer/widget/AnchoredScrollView.java | 101 | ||||
-rw-r--r-- | src/com/android/dialer/widget/PieChartView.java | 116 |
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); - } - } |