summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr kecinzer Řezníček <kecinzer@gmail.com>2014-12-23 10:54:50 +0100
committerDanny Baumann <dannybaumann@web.de>2015-01-14 10:54:03 +0100
commite14e6b568e1f8f1a3cc6a46b84f5e4a110326720 (patch)
treee80601f1eb3c3237807694e54d2a7ecd8db6c62d
parentaf0ed82196635cc08dab352ec8feeb58f4d245a0 (diff)
downloadpackages_apps_InCallUI-e14e6b568e1f8f1a3cc6a46b84f5e4a110326720.tar.gz
packages_apps_InCallUI-e14e6b568e1f8f1a3cc6a46b84f5e4a110326720.tar.bz2
packages_apps_InCallUI-e14e6b568e1f8f1a3cc6a46b84f5e4a110326720.zip
Contact details on incoming call (1/2)
Change-Id: I017dba2eb2c2ab6be30a0dabf4dcf487642d8981 Signed-off-by: Petr kecinzer Řezníček <kecinzer@gmail.com>
-rw-r--r--res/layout/call_card_content.xml44
-rw-r--r--src/com/android/incallui/CallCardFragment.java48
-rw-r--r--src/com/android/incallui/CallCardPresenter.java18
-rw-r--r--src/com/android/incallui/ContactInfoCache.java62
-rw-r--r--src/com/android/incallui/InCallApp.java9
5 files changed, 173 insertions, 8 deletions
diff --git a/res/layout/call_card_content.xml b/res/layout/call_card_content.xml
index 03081588..72c79dcc 100644
--- a/res/layout/call_card_content.xml
+++ b/res/layout/call_card_content.xml
@@ -179,6 +179,50 @@
android:layout_marginBottom="@dimen/glowpadview_margin_bottom"
android:visibility="gone" />
+ <!-- Contact details -->
+ <LinearLayout android:id="@+id/detailedCallInfo"
+ android:layout_below="@id/primary_call_info_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/call_banner_side_padding"
+ android:paddingEnd="@dimen/call_banner_side_padding"
+ android:paddingTop="@dimen/call_banner_primary_call_container_top_padding"
+ android:orientation="vertical"
+ android:visibility="gone">
+
+ <TextView android:id="@+id/position"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:singleLine="true" />
+
+ <TextView android:id="@+id/organization"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:textStyle="bold"
+ android:singleLine="true" />
+
+ <TextView android:id="@+id/city"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:maxLines="1"
+ android:ellipsize="end" />
+
+ <TextView android:id="@+id/nickName"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:maxLines="1"
+ android:ellipsize="end" />
+
+ </LinearLayout>
+
<FrameLayout
android:id="@+id/floating_end_call_action_button_container"
android:layout_width="@dimen/end_call_floating_action_button_diameter"
diff --git a/src/com/android/incallui/CallCardFragment.java b/src/com/android/incallui/CallCardFragment.java
index 7875e121..f76ae4d3 100644
--- a/src/com/android/incallui/CallCardFragment.java
+++ b/src/com/android/incallui/CallCardFragment.java
@@ -27,6 +27,7 @@ import android.content.Context;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
@@ -111,6 +112,11 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
private int mVBToastPosition;
private TextView mRecordingTimeLabel;
private TextView mRecordingIcon;
+ private View mDetailedCallInfo;
+ private TextView mNickName;
+ private TextView mOrganization;
+ private TextView mPosition;
+ private TextView mCity;
// Secondary caller info
private View mSecondaryCallInfo;
@@ -148,6 +154,7 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
private static final String RECORD_STATE_CHANGED =
"com.qualcomm.qti.phonefeature.RECORD_STATE_CHANGED";
+ private static final String PREFS_KEY_DETAILED_INFO = "detailed_incall_info";
private static final int MESSAGE_TIMER = 1;
@@ -302,6 +309,12 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
}
mRecordingTimeLabel = (TextView) view.findViewById(R.id.recordingTime);
mRecordingIcon = (TextView) view.findViewById(R.id.recordingIcon);
+
+ mDetailedCallInfo = view.findViewById(R.id.detailedCallInfo);
+ mNickName = (TextView) view.findViewById(R.id.nickName);
+ mPosition = (TextView) view.findViewById(R.id.position);
+ mOrganization = (TextView) view.findViewById(R.id.organization);
+ mCity = (TextView) view.findViewById(R.id.city);
}
@Override
@@ -492,8 +505,9 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
}
@Override
- public void setPrimary(String number, String name, boolean nameIsNumber, String label,
- Drawable photo, boolean isSipCall, boolean isForwarded) {
+ public void setPrimary(String number, String name, boolean nameIsNumber, boolean isForwarded,
+ String label, Drawable photo, boolean isSipCall,
+ String nickName, String organization, String position, String city) {
Log.d(this, "Setting primary call");
// set the name field.
@@ -513,6 +527,8 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
showCallTypeLabel(isSipCall, isForwarded);
setDrawableToImageView(mPhoto, photo);
+
+ setDetailedInfo(nickName, organization, position, city);
}
@Override
@@ -728,6 +744,7 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
} else if (isWaitingForRemoteSide) {
callStateLabel = context.getString(R.string.card_title_waiting_call);
}
+ mDetailedCallInfo.setVisibility(View.GONE);
break;
case Call.State.ONHOLD:
callStateLabel = context.getString(R.string.card_title_on_hold);
@@ -1322,4 +1339,31 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPr
return true;
}
}
+
+ private void setDetailedInfo(String nickName, String organization,
+ String position, String city) {
+ boolean showInfo;
+ final SharedPreferences prefs = InCallApp.getPrefs(getActivity());
+
+ if (prefs.getBoolean(PREFS_KEY_DETAILED_INFO, false)) {
+ showInfo = fillTextView(mNickName, nickName);
+ showInfo |= fillTextView(mOrganization, organization);
+ showInfo |= fillTextView(mPosition, position);
+ showInfo |= fillTextView(mCity, city);
+ } else {
+ showInfo = false;
+ }
+
+ mDetailedCallInfo.setVisibility(showInfo ? View.VISIBLE : View.GONE);
+ }
+
+ private boolean fillTextView(TextView view, String text) {
+ if (TextUtils.isEmpty(text)) {
+ view.setVisibility(View.GONE);
+ return false;
+ }
+ view.setText(text);
+ view.setVisibility(View.VISIBLE);
+ return true;
+ }
}
diff --git a/src/com/android/incallui/CallCardPresenter.java b/src/com/android/incallui/CallCardPresenter.java
index 8a4e8a9a..b2c65c15 100644
--- a/src/com/android/incallui/CallCardPresenter.java
+++ b/src/com/android/incallui/CallCardPresenter.java
@@ -496,7 +496,7 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
if (mPrimary == null) {
// Clear the primary display info.
- ui.setPrimary(null, null, false, null, null, false, false);
+ ui.setPrimary(null, null, false, false, null, null, false, null, null, null, null);
return;
}
@@ -508,10 +508,11 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
null /* number */,
getConferenceString(mPrimary),
false /* nameIsNumber */,
+ isForwarded,
null /* label */,
getConferencePhoto(mPrimary),
false /* isSipCall */,
- isForwarded);
+ null, null, null, null);
} else if (mPrimaryContactInfo != null) {
Log.d(TAG, "Update primary display info for " + mPrimaryContactInfo);
@@ -522,13 +523,17 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
number,
name,
nameIsNumber,
+ isForwarded,
mPrimaryContactInfo.label,
mPrimaryContactInfo.photo,
mPrimaryContactInfo.isSipCall,
- isForwarded);
+ mPrimaryContactInfo.nickName,
+ mPrimaryContactInfo.organization,
+ mPrimaryContactInfo.position,
+ mPrimaryContactInfo.city);
} else {
// Clear the primary display info.
- ui.setPrimary(null, null, false, null, null, false, false);
+ ui.setPrimary(null, null, false, false, null, null, false, null, null, null, null);
}
}
@@ -819,8 +824,9 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
public interface CallCardUi extends Ui {
void setVisible(boolean on);
void setCallCardVisible(boolean visible);
- void setPrimary(String number, String name, boolean nameIsNumber, String label,
- Drawable photo, boolean isSipCall, boolean isForwarded);
+ void setPrimary(String number, String name, boolean nameIsNumber, boolean isForwarded,
+ String label, Drawable photo, boolean isSipCall,
+ String nickName, String organization, String position, String city);
void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
String providerLabel, Drawable providerIcon, boolean isConference);
void setCallState(int state, int videoState, int sessionModificationState,
diff --git a/src/com/android/incallui/ContactInfoCache.java b/src/com/android/incallui/ContactInfoCache.java
index 1db2c53d..0570ee2d 100644
--- a/src/com/android/incallui/ContactInfoCache.java
+++ b/src/com/android/incallui/ContactInfoCache.java
@@ -17,13 +17,18 @@
package com.android.incallui;
import android.content.Context;
+import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Looper;
import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.CommonDataKinds.Nickname;
+import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.telecom.TelecomManager;
import android.text.TextUtils;
@@ -50,6 +55,14 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
private static final String TAG = ContactInfoCache.class.getSimpleName();
private static final int TOKEN_UPDATE_PHOTO_FOR_CALL_STATE = 0;
+ private static final String[] DETAILED_INFO_PROJECTION = new String[] {
+ Data.MIMETYPE,
+ Nickname.NAME,
+ Organization.COMPANY,
+ Organization.TITLE,
+ StructuredPostal.CITY
+ };
+
private final Context mContext;
private final PhoneNumberService mPhoneNumberService;
private final HashMap<String, ContactCacheEntry> mInfoMap = Maps.newHashMap();
@@ -456,6 +469,10 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
cce.location = displayLocation;
cce.label = label;
cce.isSipCall = isSipCall;
+
+ if (isIncoming) {
+ fillDetailedInfo(context, info.contactIdOrZero, cce);
+ }
}
/**
@@ -504,12 +521,57 @@ public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadComplete
public void onImageLoadComplete(String callId, ContactCacheEntry entry);
}
+ private static void fillDetailedInfo(Context context,
+ final long contactId, ContactCacheEntry cce) {
+ final String where = Data.CONTACT_ID + " = " + contactId;
+ Cursor cursor = context.getContentResolver().query(Data.CONTENT_URI,
+ DETAILED_INFO_PROJECTION, where, null, null);
+ if (cursor == null) {
+ return;
+ }
+
+ try {
+ int mimeTypeColumnIndex = cursor.getColumnIndex(Data.MIMETYPE);
+ int orgColumnIndex = cursor.getColumnIndex(Organization.COMPANY);
+ int positionColumnIndex = cursor.getColumnIndex(Organization.TITLE);
+ int nickNameColumnIndex = cursor.getColumnIndex(Nickname.NAME);
+ int cityColumnIndex = cursor.getColumnIndex(StructuredPostal.CITY);
+
+ cursor.moveToFirst();
+
+ while (!cursor.isAfterLast()) {
+ final String mimeType = cursor.getString(mimeTypeColumnIndex);
+ if (TextUtils.equals(mimeType, Organization.CONTENT_ITEM_TYPE)) {
+ if (!cursor.isNull(orgColumnIndex)) {
+ cce.organization = cursor.getString(orgColumnIndex);
+ }
+ if (!cursor.isNull(positionColumnIndex)) {
+ cce.position = cursor.getString(positionColumnIndex);
+ }
+ } else if (TextUtils.equals(mimeType, Nickname.CONTENT_ITEM_TYPE)
+ && !cursor.isNull(nickNameColumnIndex)) {
+ cce.nickName = cursor.getString(nickNameColumnIndex);
+ } else if (TextUtils.equals(mimeType, StructuredPostal.CONTENT_ITEM_TYPE)
+ && !cursor.isNull(cityColumnIndex)) {
+ cce.city = cursor.getString(cityColumnIndex);
+ }
+ cursor.moveToNext();
+ }
+ } finally {
+ cursor.close();
+ }
+ }
+
public static class ContactCacheEntry {
public String name;
public String number;
public String location;
public String label;
public Drawable photo;
+ public String nickName;
+ public String organization;
+ public String position;
+ public String city;
public boolean isSipCall;
/** This will be used for the "view" notification. */
public Uri contactUri;
diff --git a/src/com/android/incallui/InCallApp.java b/src/com/android/incallui/InCallApp.java
index 6550d9a8..06daecac 100644
--- a/src/com/android/incallui/InCallApp.java
+++ b/src/com/android/incallui/InCallApp.java
@@ -20,6 +20,7 @@ import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.telecom.VideoProfile;
@@ -60,6 +61,14 @@ public class InCallApp extends Application {
super.onConfigurationChanged(newConfig);
}
+ public static SharedPreferences getPrefs(Context context) {
+ // This replicates PreferenceManager.getDefaultSharedPreferences, except
+ // that we need multi process preferences, as the pref is written in a separate
+ // process (com.android.dialer vs. com.android.incallui)
+ final String prefName = context.getPackageName() + "_preferences";
+ return context.getSharedPreferences(prefName, Context.MODE_MULTI_PROCESS);
+ }
+
/**
* Accepts broadcatst Intents which will be prepared by {@link StatusBarNotifier} and thus
* sent from framework's notification mechanism (which is outside Phone context).