summaryrefslogtreecommitdiff
path: root/InCallUI
diff options
context:
space:
mode:
authorNancy Chen <nancychen@google.com>2015-10-02 10:51:50 -0700
committerNancy Chen <nancychen@google.com>2015-10-12 13:26:33 -0700
commite838ba2b69cf85b0d938467477e47cce4af2bfb6 (patch)
treeefdd62347b41be6be24b855445b256c544c6c552 /InCallUI
parent8a4bd60ca1b35e2c6fa46fed16891f5be4be9f46 (diff)
Add location information with business caller ID.
Display business address and distance when available when calling businesses. This information is only displayed during outgoing calls and while in the call. Bug: 23351559 Change-Id: Ifb9197cc3abf6d865e13de10862c610e8aa15fba
Diffstat (limited to 'InCallUI')
-rw-r--r--InCallUI/res/drawable-hdpi/ic_business_white_24dp.pngbin0 -> 152 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.pngbin0 -> 371 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_business_white_24dp.pngbin0 -> 105 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.pngbin0 -> 265 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_business_white_24dp.pngbin0 -> 112 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.pngbin0 -> 456 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.pngbin0 -> 119 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.pngbin0 -> 675 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.pngbin0 -> 114 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.pngbin0 -> 869 bytes
-rw-r--r--InCallUI/res/layout/business_context_info_list_item.xml5
-rw-r--r--InCallUI/res/values/dimens.xml1
-rw-r--r--InCallUI/res/values/strings.xml7
-rw-r--r--InCallUI/src/com/android/incallui/CallCardFragment.java29
-rw-r--r--InCallUI/src/com/android/incallui/CallCardPresenter.java74
-rw-r--r--InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java3
-rw-r--r--InCallUI/src/com/android/incallui/ContactInfoCache.java38
-rw-r--r--InCallUI/src/com/android/incallui/ContactUtils.java42
-rw-r--r--InCallUI/src/com/android/incallui/DistanceHelper.java37
-rw-r--r--InCallUI/src/com/android/incallui/InCallContactInteractions.java57
-rw-r--r--InCallUI/src/com/android/incallui/StatusBarNotifier.java3
-rw-r--r--InCallUI/src/com/android/incallui/service/PhoneNumberService.java1
-rw-r--r--InCallUI/src/com/android/incalluibind/ObjectFactory.java11
23 files changed, 272 insertions, 36 deletions
diff --git a/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..d10ebb766
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..7c281c3f5
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..7b9227c06
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..933eb5148
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..e5630455a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..814ca8ddc
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..7dfc8dc52
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..078b10d4f
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..c9aea72ce
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..8bcb6f620
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/layout/business_context_info_list_item.xml b/InCallUI/res/layout/business_context_info_list_item.xml
index 7ed528ce4..eba98ac87 100644
--- a/InCallUI/res/layout/business_context_info_list_item.xml
+++ b/InCallUI/res/layout/business_context_info_list_item.xml
@@ -15,11 +15,14 @@
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/business_contact_context_end_padding">
<ImageView android:id="@+id/icon"
android:layout_width="@dimen/business_contact_context_image_size"
android:layout_height="@dimen/business_contact_context_image_size"
android:scaleType="centerCrop"
+ android:tint="@color/business_contact_context_text_color"
+ android:alpha="0.8"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/business_contact_context_image_padding"
android:layout_marginRight="@dimen/business_contact_context_image_padding"/>
diff --git a/InCallUI/res/values/dimens.xml b/InCallUI/res/values/dimens.xml
index 02527d3f2..e40784671 100644
--- a/InCallUI/res/values/dimens.xml
+++ b/InCallUI/res/values/dimens.xml
@@ -133,6 +133,7 @@
<dimen name="person_contact_context_detail_padding_top">7dp</dimen>
<dimen name="person_contact_context_detail_text_size">14sp</dimen>
+ <dimen name="business_contact_context_end_padding">10dp</dimen>
<dimen name="business_contact_context_image_size">25dp</dimen>
<dimen name="business_contact_context_image_padding">20dp</dimen>
<dimen name="business_contact_context_heading_font_size">18sp</dimen>
diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml
index 0d0aab3ae..7a90953f4 100644
--- a/InCallUI/res/values/strings.xml
+++ b/InCallUI/res/values/strings.xml
@@ -470,4 +470,11 @@
<!-- Title for the call context with a business-type contact. [CHAR LIMIT=40] -->
<string name="business_contact_context_title">Business info</string>
+
+ <!-- Distance strings for business caller ID context. -->
+
+ <!-- Used to inform the user how far away a location is in miles. [CHAR LIMIT=NONE] -->
+ <string name="distance_imperial_away"><xliff:g id="distance">%.1f</xliff:g> mi away</string>
+ <!-- Used to inform the user how far away a location is in kilometers. [CHAR LIMIT=NONE] -->
+ <string name="distance_metric_away"><xliff:g id="distance">%.1f</xliff:g> km away</string>
</resources>
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index ffc7cb6c6..b276a9569 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -46,15 +46,13 @@ import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageButton;
import android.widget.ImageView;
+import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
import com.android.contacts.common.widget.FloatingActionButtonController;
-import com.android.incallui.InCallContactInteractions.BusinessContextInfo;
-import com.android.incallui.InCallContactInteractions.PersonContextInfo;
-import com.android.incallui.InCallContactInteractions.ContactContextInfo;
import com.android.phone.common.animation.AnimUtils;
import java.util.List;
@@ -336,23 +334,18 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
}
@Override
- public void setContactContext(boolean isBusiness, List<ContactContextInfo> info) {
- mPhoto.setVisibility(View.GONE);
- mPrimaryCallCardContainer.setElevation(0);
- mContactContext.setVisibility(View.VISIBLE);
-
- if (mInCallContactInteractions == null) {
- mInCallContactInteractions =
- new InCallContactInteractions(getView().getContext(), isBusiness);
- } else {
- mInCallContactInteractions.setIsBusiness(isBusiness);
- }
-
- mContactContextTitle.setText(mInCallContactInteractions.getContactContextTitle());
- mInCallContactInteractions.setData(info);
- mContactContextListView.setAdapter(mInCallContactInteractions.getListAdapter());
+ public void setContactContext(String title, ListAdapter listAdapter) {
+ mContactContextTitle.setText(title);
+ mContactContextListView.setAdapter(listAdapter);
}
+ @Override
+ public void showContactContext(boolean show) {
+ mPhoto.setVisibility(show ? View.GONE : View.VISIBLE);
+ mPrimaryCallCardContainer.setElevation(
+ show ? 0 : getResources().getDimension(R.dimen.primary_call_elevation));
+ mContactContext.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
/**
* Sets the visibility of the primary call card.
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 2cd6b6ed1..67747b827 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -36,8 +36,10 @@ import android.telecom.VideoProfile;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityManager;
+import android.widget.ListAdapter;
import com.android.incallui.Call.LogState;
+import com.android.incallui.Call.State;
import com.android.incallui.InCallContactInteractions.ContactContextInfo;
import com.android.incallui.ContactInfoCache.ContactCacheEntry;
import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
@@ -48,6 +50,7 @@ import com.android.incallui.InCallPresenter.InCallStateListener;
import com.android.incallui.InCallPresenter.IncomingCallListener;
import com.android.incalluibind.ObjectFactory;
+import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.List;
@@ -60,7 +63,7 @@ import com.google.common.base.Preconditions;
*/
public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
implements InCallStateListener, IncomingCallListener, InCallDetailsListener,
- InCallEventListener, CallList.CallUpdateListener {
+ InCallEventListener, CallList.CallUpdateListener, DistanceHelper.Listener {
public interface EmergencyCallListener {
public void onCallUpdated(BaseFragment fragment, boolean isEmergency);
@@ -71,6 +74,7 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
private final EmergencyCallListener mEmergencyCallListener =
ObjectFactory.newEmergencyCallListener();
+ private DistanceHelper mDistanceHelper;
private Call mPrimary;
private Call mSecondary;
@@ -80,6 +84,7 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
private Context mContext;
private boolean mSpinnerShowing = false;
private boolean mHasShownToast = false;
+ private InCallContactInteractions mInCallContactInteractions;
public static class ContactLookupCallback implements ContactInfoCacheCallback {
private final WeakReference<CallCardPresenter> mCallCardPresenter;
@@ -106,6 +111,13 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
}
}
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onContactInteractionsInfoComplete(callId, entry);
+ }
+ }
}
public CallCardPresenter() {
@@ -120,6 +132,7 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
public void init(Context context, Call call) {
mContext = Preconditions.checkNotNull(context);
+ mDistanceHelper = ObjectFactory.newDistanceHelper(mContext, this);
// Call may be null if disconnect happened already.
if (call != null) {
@@ -172,6 +185,10 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
CallList.getInstance().removeCallUpdateListener(mPrimary.getId(), this);
}
+ if (mDistanceHelper != null) {
+ mDistanceHelper.cleanUp();
+ }
+
mPrimary = null;
mPrimaryContactInfo = null;
mSecondaryContactInfo = null;
@@ -210,6 +227,10 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
secondary = getCallToDisplay(callList, primary, true);
}
+ if (mInCallContactInteractions != null) {
+ ui.showContactContext(newState != InCallState.INCOMING);
+ }
+
Log.d(this, "Primary call: " + primary);
Log.d(this, "Secondary call: " + secondary);
@@ -543,6 +564,54 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
}
}
+ private void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {
+ if (getUi() == null) {
+ return;
+ }
+
+ if (mPrimary != null && callId.equals(mPrimary.getId())) {
+ mPrimaryContactInfo.locationAddress = entry.locationAddress;
+ updateContactInteractions();
+ }
+ }
+
+ @Override
+ public void onLocationReady() {
+ // This will only update the contacts interactions data if the location returns after
+ // the contact information is found.
+ updateContactInteractions();
+ }
+
+ private void updateContactInteractions() {
+ if (mPrimary != null && mPrimaryContactInfo != null
+ && mPrimaryContactInfo.locationAddress != null) {
+ setInCallContactInteractionsType(true);
+
+ mInCallContactInteractions.setBusinessInfo(
+ mPrimaryContactInfo.locationAddress,
+ mDistanceHelper.calculateDistance(mPrimaryContactInfo.locationAddress));
+ getUi().setContactContext(
+ null,
+ mInCallContactInteractions.getListAdapter());
+ getUi().showContactContext(mPrimary.getState() != State.INCOMING);
+ }
+ }
+
+ /**
+ * Update the contact interactions type so that the correct UI is shown.
+ *
+ * @param isBusiness {@code true} if the interaction is a business interaction, {@code false} if
+ * it is a personal contact.
+ */
+ private void setInCallContactInteractionsType(boolean isBusiness) {
+ if (mInCallContactInteractions == null) {
+ mInCallContactInteractions =
+ new InCallContactInteractions(mContext, isBusiness);
+ } else {
+ mInCallContactInteractions.setIsBusiness(isBusiness);
+ }
+ }
+
private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary) {
if (isPrimary) {
mPrimaryContactInfo = entry;
@@ -954,7 +1023,8 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
public interface CallCardUi extends Ui {
void setVisible(boolean on);
- void setContactContext(boolean isBusiness, List<ContactContextInfo> info);
+ void setContactContext(String title, ListAdapter listAdapter);
+ void showContactContext(boolean show);
void setCallCardVisible(boolean visible);
void setPrimary(String number, String name, boolean nameIsNumber, String label,
Drawable photo, boolean isSipCall, boolean isContactPhotoShown);
diff --git a/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java b/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
index 0e6d6e9c8..a0588a11e 100644
--- a/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -137,6 +137,9 @@ public class ConferenceParticipantListAdapter extends BaseAdapter {
update(callId, entry);
}
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {}
+
/**
* Updates the contact information for a participant.
*
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
index 7de16486e..0e6a3d4e0 100644
--- a/InCallUI/src/com/android/incallui/ContactInfoCache.java
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.location.Address;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Looper;
@@ -44,7 +45,7 @@ import org.json.JSONObject;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import java.util.HashMap;
@@ -71,6 +72,7 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
private Drawable mDefaultContactPhotoDrawable;
private Drawable mConferencePhotoDrawable;
+ private ContactUtils mContactUtils;
public static synchronized ContactInfoCache getInstance(Context mContext) {
if (sCache == null) {
@@ -84,6 +86,8 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
mPhoneNumberService = ObjectFactory.newPhoneNumberService(context);
mCachedNumberLookupService =
com.android.dialerbind.ObjectFactory.newCachedNumberLookupService();
+ mContactUtils = ObjectFactory.getContactUtilsInstance(context);
+
}
public ContactCacheEntry getInfo(String callId) {
@@ -249,7 +253,7 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
}
class PhoneNumberServiceListener implements PhoneNumberService.NumberLookupListener,
- PhoneNumberService.ImageLookupListener {
+ PhoneNumberService.ImageLookupListener, ContactUtils.Listener {
private final String mCallId;
PhoneNumberServiceListener(String callId) {
@@ -295,12 +299,18 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
entry.photo = mContext.getResources().getDrawable(R.drawable.img_business);
}
+ String address = null;
+ if (mContactUtils != null) {
+ // This method will callback "onAddressDetailsFound".
+ address = mContactUtils.getAddressFromLookupKey(info.getLookupKey(), this);
+ }
+
// Add the contact info to the cache.
mInfoMap.put(mCallId, entry);
sendInfoNotifications(mCallId, entry);
// If there is no image then we should not expect another callback.
- if (info.getImageUrl() == null) {
+ if (info.getImageUrl() == null && address == null) {
// We're done, so clear callbacks
clearCallbacks(mCallId);
}
@@ -310,6 +320,14 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
public void onImageFetchComplete(Bitmap bitmap) {
onImageLoadComplete(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE, null, bitmap, mCallId);
}
+
+ @Override
+ public void onAddressDetailsFound(Address address) {
+ final ContactCacheEntry entry = mInfoMap.get(mCallId);
+ entry.locationAddress = address;
+ sendContactInteractionsNotifications(mCallId, entry);
+ clearCallbacks(mCallId);
+ }
}
/**
@@ -531,6 +549,15 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
}
}
+ private void sendContactInteractionsNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onContactInteractionsInfoComplete(callId, entry);
+ }
+ }
+ }
+
private void clearCallbacks(String callId) {
mCallBacks.remove(callId);
}
@@ -570,6 +597,7 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
public interface ContactInfoCacheCallback {
public void onContactInfoComplete(String callId, ContactCacheEntry entry);
public void onImageLoadComplete(String callId, ContactCacheEntry entry);
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry);
}
public static class ContactCacheEntry {
@@ -585,11 +613,12 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
public Uri displayPhotoUri;
public Uri lookupUri; // Sent to NotificationMananger
public String lookupKey;
+ public Address locationAddress;
public int contactLookupResult = LogState.LOOKUP_NOT_FOUND;
@Override
public String toString() {
- return Objects.toStringHelper(this)
+ return MoreObjects.toStringHelper(this)
.add("name", MoreStrings.toSafeString(name))
.add("number", MoreStrings.toSafeString(number))
.add("location", MoreStrings.toSafeString(location))
@@ -598,6 +627,7 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
.add("isSipCall", isSipCall)
.add("contactUri", contactUri)
.add("displayPhotoUri", displayPhotoUri)
+ .add("locationAddress", locationAddress)
.add("contactLookupResult", contactLookupResult)
.toString();
}
diff --git a/InCallUI/src/com/android/incallui/ContactUtils.java b/InCallUI/src/com/android/incallui/ContactUtils.java
new file mode 100644
index 000000000..eac748494
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactUtils.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 The Android Open Source 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.incallui;
+
+import android.content.Context;
+import android.location.Address;
+
+import com.android.incalluibind.ObjectFactory;
+
+/**
+ * Utility functions to help manipulate contact data.
+ */
+public abstract class ContactUtils {
+ protected Context mContext;
+
+ public static ContactUtils getInstance(Context context) {
+ return ObjectFactory.getContactUtilsInstance(context);
+ }
+
+ protected ContactUtils(Context context) {
+ mContext = context;
+ }
+
+ public interface Listener {
+ public void onAddressDetailsFound(Address address);
+ }
+
+ public abstract String getAddressFromLookupKey(String lookupKey, Listener listener);
+}
diff --git a/InCallUI/src/com/android/incallui/DistanceHelper.java b/InCallUI/src/com/android/incallui/DistanceHelper.java
new file mode 100644
index 000000000..a4db5fed3
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DistanceHelper.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2015 The Android Open Source 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.incallui;
+
+import android.location.Address;
+
+/**
+ * Superclass for a helper class to get the current location and distance to other locations.
+ */
+public abstract class DistanceHelper {
+ public static final float DISTANCE_NOT_FOUND = -1;
+ public static final float MILES_PER_METER = (float) 0.000621371192;
+ public static final float KILOMETERS_PER_METER = (float) 0.001;
+
+ public interface Listener {
+ public void onLocationReady();
+ }
+
+ public void cleanUp() {}
+
+ public float calculateDistance(Address address) {
+ return DISTANCE_NOT_FOUND;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallContactInteractions.java b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
index 0ed8b2012..6f30720c2 100644
--- a/InCallUI/src/com/android/incallui/InCallContactInteractions.java
+++ b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
@@ -17,6 +17,8 @@
package com.android.incallui;
import android.content.Context;
+import android.location.Address;
+import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -27,7 +29,9 @@ import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
/**
* Wrapper class for objects that are used in generating the context about the contact in the InCall
@@ -64,13 +68,40 @@ public class InCallContactInteractions {
}
}
- /**
- * Set the data for the list adapter.
- * @param data The data to add to the list adapter. This completely replaces any previous data.
- */
- public void setData(List<ContactContextInfo> data) {
+ public void setBusinessInfo(Address address, float distance) {
mListAdapter.clear();
- mListAdapter.addAll(data);
+ mListAdapter.addAll(constructBusinessContextInfo(address, distance));
+ }
+
+ private List<ContactContextInfo> constructBusinessContextInfo(Address address, float distance) {
+ List<ContactContextInfo> info = new ArrayList<ContactContextInfo>();
+
+ BusinessContextInfo headerInfo = new BusinessContextInfo();
+ headerInfo.iconId = R.drawable.ic_business_white_24dp;
+ headerInfo.heading = getContactContextTitle();
+ info.add(headerInfo);
+
+ //TODO: hours of operation information
+
+ // Location information
+ BusinessContextInfo distanceInfo = new BusinessContextInfo();
+ distanceInfo.iconId = R.drawable.ic_location_on_white_24dp;
+ if (distance != DistanceHelper.DISTANCE_NOT_FOUND) {
+ //TODO: add a setting to allow the user to select "KM" or "MI" as their distance units.
+ if (Locale.US.equals(Locale.getDefault())) {
+ distanceInfo.heading = mContext.getString(R.string.distance_imperial_away,
+ distance * DistanceHelper.MILES_PER_METER);
+ } else {
+ distanceInfo.heading = mContext.getString(R.string.distance_metric_away,
+ distance * DistanceHelper.KILOMETERS_PER_METER);
+ }
+ }
+ if (address != null) {
+ distanceInfo.detail = address.getAddressLine(0);
+ }
+ info.add(distanceInfo);
+
+ return info;
}
/**
@@ -99,13 +130,20 @@ public class InCallContactInteractions {
TextView headingTextView = (TextView) listItem.findViewById(R.id.heading);
TextView detailTextView = (TextView) listItem.findViewById(R.id.detail);
- if (this.iconId == 0 || this.heading == null || this.detail == null) {
+ if (this.iconId == 0 || (this.heading == null && this.detail == null)) {
return;
}
imageView.setImageDrawable(listItem.getContext().getDrawable(this.iconId));
+
headingTextView.setText(this.heading);
+ headingTextView.setVisibility(TextUtils.isEmpty(this.heading)
+ ? View.GONE : View.VISIBLE);
+
detailTextView.setText(this.detail);
+ detailTextView.setVisibility(TextUtils.isEmpty(this.detail)
+ ? View.GONE : View.VISIBLE);
+
}
}
@@ -157,9 +195,7 @@ public class InCallContactInteractions {
LayoutInflater inflater = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View listItem;
- listItem = inflater.inflate(mResId, null);
-
+ View listItem = inflater.inflate(mResId, null);
ContactContextInfo item = getItem(position);
if (item == null) {
@@ -167,7 +203,6 @@ public class InCallContactInteractions {
}
item.bindView(listItem);
-
return listItem;
}
}
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 35a22c9d8..f46b0d30c 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -188,6 +188,9 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener,
buildAndSendNotification(call, entry);
}
}
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {}
});
}
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
index cddc478cf..70da4ef3a 100644
--- a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -60,6 +60,7 @@ public interface PhoneNumberService {
public String getPhoneLabel();
public String getNormalizedNumber();
public String getImageUrl();
+ public String getLookupKey();
public boolean isBusiness();
public int getLookupSource();
}
diff --git a/InCallUI/src/com/android/incalluibind/ObjectFactory.java b/InCallUI/src/com/android/incalluibind/ObjectFactory.java
index d8a2e2977..7e9423acf 100644
--- a/InCallUI/src/com/android/incalluibind/ObjectFactory.java
+++ b/InCallUI/src/com/android/incalluibind/ObjectFactory.java
@@ -20,6 +20,8 @@ import android.content.Context;
import android.content.Intent;
import com.android.incallui.CallCardPresenter.EmergencyCallListener;
+import com.android.incallui.ContactUtils;
+import com.android.incallui.DistanceHelper;
import com.android.incallui.service.PhoneNumberService;
public class ObjectFactory {
@@ -45,4 +47,13 @@ public class ObjectFactory {
public static Intent getCallStateButtonBroadcastIntent(Context context) {
return null;
}
+
+ public static DistanceHelper newDistanceHelper(Context context,
+ DistanceHelper.Listener listener) {
+ return null;
+ }
+
+ public static ContactUtils getContactUtilsInstance(Context context) {
+ return null;
+ }
}