diff options
author | Stephen Bird <sbird@cyngn.com> | 2016-01-14 17:33:53 -0800 |
---|---|---|
committer | Stephen Bird <sbird@cyngn.com> | 2016-04-08 10:15:57 -0700 |
commit | 03414c9e072339b1f82d5450593f8ba86d970210 (patch) | |
tree | 170d2e450bd12130067e9b685c732c5123f6cd85 /src | |
parent | 0e7b096e00b9a42d3e6f420e9296d288833fa92c (diff) | |
download | android_packages_apps_Dialer-03414c9e072339b1f82d5450593f8ba86d970210.tar.gz android_packages_apps_Dialer-03414c9e072339b1f82d5450593f8ba86d970210.tar.bz2 android_packages_apps_Dialer-03414c9e072339b1f82d5450593f8ba86d970210.zip |
Initial Bringup of InCall Call Log modifications
Change-Id: I42401aec993107b897ea301b69eb2ec9c4acb238
Diffstat (limited to 'src')
6 files changed, 224 insertions, 23 deletions
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java index 5a87bc8ce..effb8135e 100644 --- a/src/com/android/dialer/calllog/CallLogAdapter.java +++ b/src/com/android/dialer/calllog/CallLogAdapter.java @@ -16,6 +16,7 @@ package com.android.dialer.calllog; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -55,6 +56,7 @@ import com.android.dialer.PhoneCallDetails; import com.android.dialer.R; import com.android.dialer.contactinfo.ContactInfoCache; import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener; +import com.android.dialer.util.CallMethodHelper; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.PhoneNumberUtil; import com.android.dialer.voicemail.VoicemailPlaybackPresenter; @@ -541,6 +543,11 @@ public class CallLogAdapter extends GroupingListAdapter // Default case: an item in the call log. views.primaryActionView.setVisibility(View.VISIBLE); + String component = c.getString(CallLogQuery.PLUGIN_PACKAGE_NAME); + if (!TextUtils.isEmpty(component)) { + views.inCallComponentName = ComponentName.unflattenFromString(component);; + } + // Check if the day group has changed and display a header if necessary. int currentGroup = getDayGroupForCall(views.rowId); int previousGroup = getPreviousDayGroup(c); @@ -570,6 +577,8 @@ public class CallLogAdapter extends GroupingListAdapter views.setPhoto(info.photoId, info.photoUri, info.lookupUri, nameForDefaultImage, isVoicemailNumber, views.isBusiness); + views.setAttributionImage(views.inCallComponentName); + mCallLogListItemHelper.setPhoneCallDetails(views, details); } diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java index 84d26d36d..ba78dbfbc 100644 --- a/src/com/android/dialer/calllog/CallLogFragment.java +++ b/src/com/android/dialer/calllog/CallLogFragment.java @@ -25,6 +25,7 @@ import android.app.Activity; import android.app.DialogFragment; import android.app.Fragment; import android.app.KeyguardManager; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -52,7 +53,9 @@ import com.android.contacts.common.GeoUtil; import com.android.contacts.common.util.PermissionsUtil; import com.android.contacts.common.util.ViewUtil; import com.android.dialer.R; +import com.android.dialer.incall.CallMethodInfo; import com.android.dialer.list.ListsFragment.HostInterface; +import com.android.dialer.util.CallMethodHelper; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.EmptyLoader; import com.android.dialer.voicemail.VoicemailPlaybackPresenter; @@ -64,8 +67,11 @@ import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClicked import com.android.dialerbind.ObjectFactory; import com.cyanogen.ambient.incall.CallLogConstants; +import java.util.HashMap; import java.util.List; +import android.util.Log; + /** * Displays a list of call log entries. To filter for a particular kind of call * (all, missed or voicemails), specify it in the constructor. @@ -147,6 +153,22 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis */ private boolean mIsRecentsFragment; + /* InCall Plugin Listener ID */ + private static final String AMBIENT_SUBSCRIPTION_ID = "CallLogFragment"; + + private CallMethodHelper.CallMethodReceiver pluginsUpdatedReceiver = + new CallMethodHelper.CallMethodReceiver() { + @Override + public void onChanged(HashMap<ComponentName, CallMethodInfo> callMethodInfos) { + // We moved this here because well, getting our call method data takes some time + // we _should_cache this icon somewhere -> load that, then when this updates + // we could update the icons. Currentlly the user has some ugly ugly flash + // as some icons pop up. + refreshData(); + mAdapter.startCache(); + } + }; + public interface HostInterface { public void showDialpad(); } @@ -338,8 +360,9 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis updateEmptyMessage(mCallTypeFilter); } mHasReadCallLogPermission = hasReadCallLogPermission; - refreshData(); - mAdapter.startCache(); + + + CallMethodHelper.subscribe(AMBIENT_SUBSCRIPTION_ID, pluginsUpdatedReceiver); } @Override @@ -348,6 +371,9 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis mVoicemailPlaybackPresenter.onPause(); } mAdapter.pauseCache(); + + CallMethodHelper.unsubscribe(AMBIENT_SUBSCRIPTION_ID); + super.onPause(); } diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java index bce73c41a..0c6ad4ff9 100644 --- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java +++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java @@ -17,6 +17,7 @@ package com.android.dialer.calllog; import android.app.Activity; +import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; import android.content.Intent; @@ -27,7 +28,9 @@ import android.provider.ContactsContract.CommonDataKinds.Phone; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.telecom.PhoneAccountHandle; +import android.telephony.PhoneNumberUtils; import android.text.TextUtils; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; @@ -35,6 +38,9 @@ import android.widget.QuickContactBadge; import android.widget.ImageView; import android.widget.TextView; +import com.android.dialer.incall.CallMethodInfo; +import com.android.dialer.util.CallMethodHelper; +import com.android.dialer.widget.DialerQuickContact; import com.android.internal.telephony.util.BlacklistUtils; import com.android.contacts.common.ContactPhotoManager; @@ -49,6 +55,8 @@ import com.android.dialer.util.PhoneNumberUtil; import com.android.dialer.voicemail.VoicemailPlaybackPresenter; import com.android.dialer.voicemail.VoicemailPlaybackLayout; +import com.cyanogen.ambient.incall.extension.OriginCodes; + /** * This is an object containing references to views contained by the call log list item. This * improves performance by reducing the frequency with which we need to find views by IDs. @@ -72,6 +80,8 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder public final CardView callLogEntryView; /** The actionable view which places a call to the number corresponding to the call log row. */ public final ImageView primaryActionButtonView; + /** DialerQuickContact */ + public final DialerQuickContact dialerQuickContact; /** The view containing call log item actions. Null until the ViewStub is inflated. */ public View actionsView; @@ -88,6 +98,8 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder private ContactInfoHelper mContactInfoHelper; + private static final String TAG = CallLogListItemViewHolder.class.getSimpleName(); + /** * The row Id for the first call associated with the call log entry. Used as a key for the * map used to track which call log entries have the action button section expanded. @@ -153,6 +165,13 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder public boolean isBusiness; /** + * InCallPlugin Associated with this call log entry + * + * If null, plugin does not exist + */ + public ComponentName inCallComponentName; + + /** * The contact info for the contact displayed in this list item. */ public ContactInfo info; @@ -176,7 +195,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder CallLogListItemHelper callLogListItemHelper, VoicemailPlaybackPresenter voicemailPlaybackPresenter, View rootView, - QuickContactBadge quickContactView, + DialerQuickContact dialerQuickContact, View primaryActionView, PhoneCallDetailsViews phoneCallDetailsViews, CardView callLogEntryView, @@ -191,12 +210,13 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder mVoicemailPlaybackPresenter = voicemailPlaybackPresenter; this.rootView = rootView; - this.quickContactView = quickContactView; + this.dialerQuickContact = dialerQuickContact; this.primaryActionView = primaryActionView; this.phoneCallDetailsViews = phoneCallDetailsViews; this.callLogEntryView = callLogEntryView; this.dayGroupHeader = dayGroupHeader; this.primaryActionButtonView = primaryActionButtonView; + this.quickContactView = this.dialerQuickContact.getQuickContactBadge(); Resources resources = mContext.getResources(); mPhotoSize = resources.getDimensionPixelSize(R.dimen.contact_photo_size); @@ -229,7 +249,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder callLogListItemHelper, voicemailPlaybackPresenter, view, - (QuickContactBadge) view.findViewById(R.id.quick_contact_photo), + (DialerQuickContact) view.findViewById(R.id.quick_contact_photo), view.findViewById(R.id.primary_action_view), PhoneCallDetailsViews.fromView(view), (CardView) view.findViewById(R.id.call_log_row), @@ -304,8 +324,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder primaryActionButtonView.setTag( IntentProvider.getReturnVoicemailCallIntentProvider()); } else { - primaryActionButtonView.setTag( - IntentProvider.getReturnCallIntentProvider(number)); + if (inCallComponentName != null) { + primaryActionButtonView.setTag("phone"); + } else { + primaryActionButtonView.setTag( + IntentProvider.getReturnCallIntentProvider(number)); + } } primaryActionButtonView.setContentDescription(TextUtils.expandTemplate( @@ -338,11 +362,22 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder callButtonView.setVisibility(View.GONE); } + CallMethodInfo cmi = null; + if (inCallComponentName != null) { + cmi = CallMethodHelper.getCallMethod(inCallComponentName); + } + // If one of the calls had video capabilities, show the video call button. if (mTelecomCallLogCache.isVideoEnabled() && canPlaceCallToNumber && - phoneCallDetailsViews.callTypeIcons.isVideoShown()) { - videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number)); - videoCallButtonView.setVisibility(View.VISIBLE); + phoneCallDetailsViews.callTypeIcons.isVideoShown() || + (cmi != null && !PhoneNumberUtils.isGlobalPhoneNumber(number))) { + if (cmi.mIsInCallProvider) { + videoCallButtonView.setTag("video"); + videoCallButtonView.setVisibility(View.VISIBLE); + } else { + videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number)); + videoCallButtonView.setVisibility(View.VISIBLE); + } } else { videoCallButtonView.setVisibility(View.GONE); } @@ -435,6 +470,16 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder view.setSingleLine(!isExpanded); } + public void setAttributionImage(ComponentName cn) { + if (cn == null) return; + CallMethodInfo cmi = CallMethodHelper.getCallMethod(cn); + if (cmi == null) { + Log.v(TAG, "Call Method was Null for: " + cn.toShortString()); + } else { + dialerQuickContact.setAttributionBadge(cmi.mBadgeIcon); + } + } + public void setPhoto(long photoId, Uri photoUri, Uri contactUri, String displayName, boolean isVoicemail, boolean isBusiness) { quickContactView.assignContactUri(contactUri); @@ -490,12 +535,42 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder } updateBlockCallerView(); } else { - final IntentProvider intentProvider = (IntentProvider) view.getTag(); - if (intentProvider != null) { - final Intent intent = intentProvider.getIntent(mContext); - // See IntentProvider.getCallDetailIntentProvider() for why this may be null. - if (intent != null) { - DialerUtils.startActivityWithErrorToast(mContext, intent); + if (inCallComponentName != null) { + CallMethodInfo cmi = CallMethodHelper.getCallMethod(inCallComponentName); + if (cmi != null) { + String callProviderActionName = (String) view.getTag(); + switch (callProviderActionName) { + case "video": + cmi.placeCall(OriginCodes.CALL_LOG_CALL, number, mContext, true); + break; + case "messaging": + // TODO: implement way to start incall message thread + break; + case "phone": + cmi.placeCall(OriginCodes.CALL_LOG_CALL, number, mContext); + break; + default: + // Unsupported thing, use default intent + final IntentProvider intentProvider = (IntentProvider) view.getTag(); + if (intentProvider != null) { + final Intent intent = intentProvider.getIntent(mContext); + // See IntentProvider.getCallDetailIntentProvider() + // for why this may be null. + if (intent != null) { + DialerUtils.startActivityWithErrorToast(mContext, intent); + } + } + break; + } + } + } else { + final IntentProvider intentProvider = (IntentProvider) view.getTag(); + if (intentProvider != null) { + final Intent intent = intentProvider.getIntent(mContext); + // See IntentProvider.getCallDetailIntentProvider() for why this may be null. + if (intent != null) { + DialerUtils.startActivityWithErrorToast(mContext, intent); + } } } } @@ -515,7 +590,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder new CallLogListItemHelper(phoneCallDetailsHelper, resources, telecomCallLogCache), null /* voicemailPlaybackPresenter */, new View(context), - new QuickContactBadge(context), + new DialerQuickContact(context), new View(context), PhoneCallDetailsViews.createForTest(context), new CardView(context), diff --git a/src/com/android/dialer/incall/CallMethodHelper.java b/src/com/android/dialer/incall/CallMethodHelper.java index 24c042202..cf241b0db 100644 --- a/src/com/android/dialer/incall/CallMethodHelper.java +++ b/src/com/android/dialer/incall/CallMethodHelper.java @@ -279,7 +279,11 @@ public class CallMethodHelper { * @return specific call method when given a component name. */ public static CallMethodInfo getCallMethod(ComponentName cn) { - return mCallMethodInfos.get(cn); + if (mCallMethodInfos.containsKey(cn)) { + return mCallMethodInfos.get(cn); + } else { + return null; + } } /** diff --git a/src/com/android/dialer/incall/CallMethodInfo.java b/src/com/android/dialer/incall/CallMethodInfo.java index 758b03445..062e876ef 100644 --- a/src/com/android/dialer/incall/CallMethodInfo.java +++ b/src/com/android/dialer/incall/CallMethodInfo.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.UserHandle; +import android.telephony.PhoneNumberUtils; import com.android.dialer.DialerApplication; import com.android.dialer.incall.CallMethodHelper; import com.android.phone.common.util.StartInCallCallReceiver; @@ -106,12 +107,24 @@ public class CallMethodInfo { } public void placeCall(String origin, String number, Context c) { - StartInCallCallReceiver svcrr = CallMethodHelper.getVoIPResultReceiver(this, origin); + placeCall(origin, number, c, false); + } - StartCallRequest request = new StartCallRequest( - number, OriginCodes.DIALPAD_DIRECT_DIAL, 0, svcrr); + public void placeCall(String origin, String number, Context c, boolean isVideoCall) { + StartInCallCallReceiver svcrr = CallMethodHelper.getVoIPResultReceiver(this, origin); + StartCallRequest request = new StartCallRequest(number, origin, 0, svcrr); - InCallServices.getInstance().startOutCall( - DialerApplication.ACLIENT.get(c), this.mComponent, request); + if (isVideoCall) { + InCallServices.getInstance().startVideoCall( + DialerApplication.ACLIENT.get(c), this.mComponent, request); + } else { + if (PhoneNumberUtils.isGlobalPhoneNumber(number)) { + InCallServices.getInstance().startOutCall( + DialerApplication.ACLIENT.get(c), this.mComponent, request); + } else { + InCallServices.getInstance().startVoiceCall( + DialerApplication.ACLIENT.get(c), this.mComponent, request); + } + } } } diff --git a/src/com/android/dialer/widget/DialerQuickContact.java b/src/com/android/dialer/widget/DialerQuickContact.java new file mode 100644 index 000000000..7641dfc1f --- /dev/null +++ b/src/com/android/dialer/widget/DialerQuickContact.java @@ -0,0 +1,74 @@ +package com.android.dialer.widget; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.QuickContactBadge; +import com.android.dialer.R; + +public class DialerQuickContact extends FrameLayout { + + private QuickContactBadge mQuickContactBadge; + private ImageView mAttributionBadgeSlot; + private Context mContext; + + + public DialerQuickContact(Context context) { + super(context); + setupViews(); + } + + public DialerQuickContact(Context context, AttributeSet attrs) { + super(context, attrs); + setupViews(); + } + + public DialerQuickContact(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + setupViews(); + } + + public DialerQuickContact(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + setupViews(); + } + + private void setupViews() { + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + View v = inflater.inflate(R.layout.contact_image_with_attribution, this, true); + mQuickContactBadge = (QuickContactBadge) v.findViewById(R.id.contact_photo); + mAttributionBadgeSlot = (ImageView) v.findViewById(R.id.attribution_logo); + } + + public QuickContactBadge getQuickContactBadge() { + return mQuickContactBadge; + } + + public ImageView getAttributionBadgeSlot() { + return mAttributionBadgeSlot; + } + + public void setAttributionBadge(Drawable drawable) { + if (drawable == null) { + mAttributionBadgeSlot.setVisibility(View.GONE); + return; + } + int dimens = getContext().getResources().getDimensionPixelSize(R.dimen.contact_photo_size) / 3; + + FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( + dimens, dimens, Gravity.BOTTOM | Gravity.RIGHT); + mAttributionBadgeSlot.setLayoutParams(layoutParams); + mAttributionBadgeSlot.setImageDrawable(drawable); + mAttributionBadgeSlot.setVisibility(View.VISIBLE); + + invalidate(); + } + +} |