summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/layout/call_log_list_item.xml7
-rw-r--r--res/layout/contact_image_with_attribution.xml16
-rw-r--r--res/values/cm_dimens.xml4
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java9
-rw-r--r--src/com/android/dialer/calllog/CallLogFragment.java30
-rw-r--r--src/com/android/dialer/calllog/CallLogListItemViewHolder.java105
-rw-r--r--src/com/android/dialer/incall/CallMethodHelper.java6
-rw-r--r--src/com/android/dialer/incall/CallMethodInfo.java23
-rw-r--r--src/com/android/dialer/widget/DialerQuickContact.java74
9 files changed, 246 insertions, 28 deletions
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index ec512b67f..089f822ae 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -60,14 +60,11 @@
android:nextFocusRight="@+id/call_back_action"
android:nextFocusLeft="@+id/quick_contact_photo" >
- <QuickContactBadge
+ <com.android.dialer.widget.DialerQuickContact
android:id="@+id/quick_contact_photo"
android:layout_width="@dimen/contact_photo_size"
android:layout_height="@dimen/contact_photo_size"
- android:paddingTop="2dp"
- android:nextFocusRight="@id/primary_action_view"
- android:layout_gravity="top"
- android:focusable="true" />
+ android:layout_marginEnd="@dimen/contact_list_badge_margin"/>
<LinearLayout
android:layout_width="0dp"
diff --git a/res/layout/contact_image_with_attribution.xml b/res/layout/contact_image_with_attribution.xml
new file mode 100644
index 000000000..8ebf2c542
--- /dev/null
+++ b/res/layout/contact_image_with_attribution.xml
@@ -0,0 +1,16 @@
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <QuickContactBadge
+ android:id="@+id/contact_photo"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent" />
+
+ <ImageView
+ android:id="@+id/attribution_logo"
+ android:layout_height="0dp"
+ android:layout_width="0dp"
+ android:scaleType="fitCenter"
+ android:layout_gravity="bottom|right"
+ android:visibility="gone"/>
+
+</merge>
diff --git a/res/values/cm_dimens.xml b/res/values/cm_dimens.xml
new file mode 100644
index 000000000..c2390bfdc
--- /dev/null
+++ b/res/values/cm_dimens.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <dimen name="contact_list_badge_margin">1dp</dimen>
+</resources> \ No newline at end of file
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();
+ }
+
+}