diff options
author | Petr kecinzer Řezníček <kecinzer@gmail.com> | 2014-12-23 10:54:50 +0100 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-03-21 16:26:29 -0700 |
commit | d8821eeeb7d5638092145fdf9ce71795fb4bcf24 (patch) | |
tree | 8acc88571e15006aab72f2d2ba0ef2b949c99c54 | |
parent | 3270033bb0032e245ad2a10e0f2fbe99ef1bb556 (diff) | |
download | packages_apps_InCallUI-d8821eeeb7d5638092145fdf9ce71795fb4bcf24.tar.gz packages_apps_InCallUI-d8821eeeb7d5638092145fdf9ce71795fb4bcf24.tar.bz2 packages_apps_InCallUI-d8821eeeb7d5638092145fdf9ce71795fb4bcf24.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.xml | 44 | ||||
-rw-r--r-- | src/com/android/incallui/CallCardFragment.java | 48 | ||||
-rw-r--r-- | src/com/android/incallui/CallCardPresenter.java | 18 | ||||
-rw-r--r-- | src/com/android/incallui/ContactInfoCache.java | 62 | ||||
-rw-r--r-- | src/com/android/incallui/InCallApp.java | 9 |
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 05cca9a2..9d43797b 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; @@ -112,6 +113,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 @@ -725,6 +741,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); @@ -1337,4 +1354,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 0b9daafd..1c5ea6b8 100644 --- a/src/com/android/incallui/CallCardPresenter.java +++ b/src/com/android/incallui/CallCardPresenter.java @@ -516,7 +516,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; } @@ -527,10 +527,11 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> null /* number */, getConferenceString(mPrimary), false /* nameIsNumber */, + isForwarded, null /* label */, getConferencePhoto(mPrimary), false /* isSipCall */, - false /* isFOrwarded */); + null, null, null, null); } else if (mPrimaryContactInfo != null) { Log.d(TAG, "Update primary display info for " + mPrimaryContactInfo); @@ -544,13 +545,17 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> number, checkIdpName, 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); } } @@ -841,8 +846,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 414c3203..482f2d22 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). |