diff options
author | Tyler Gunn <tgunn@google.com> | 2015-08-04 13:33:49 -0700 |
---|---|---|
committer | Tyler Gunn <tgunn@google.com> | 2015-08-04 13:33:49 -0700 |
commit | a4e1829625be913e69ba52976a97b4f1875eb039 (patch) | |
tree | a076f9f2bfe42bde0ce4e9aa5d77c6fd1196b5b0 | |
parent | 84908f1553777d93d4769fb6ef6e22d07f22e521 (diff) | |
download | packages_apps_ContactsCommon-a4e1829625be913e69ba52976a97b4f1875eb039.tar.gz packages_apps_ContactsCommon-a4e1829625be913e69ba52976a97b4f1875eb039.tar.bz2 packages_apps_ContactsCommon-a4e1829625be913e69ba52976a97b4f1875eb039.zip |
Add "call with a note" resources
Note: UX resource for ic_call_note_while; UX needs to send me proper
version in all resolutions.
- Added new CallSubjectDialog class to display the call subject dialog.
- Moved getLookupKeyFromUri from Dialer into UriUtils.
- Note: Limit of 16 chars is in place until b/22806380 is resolved.
Bug: 22685114
Change-Id: I9744765c3bbc6672a400fe3d1522c5af1b793781
-rw-r--r-- | res/drawable-hdpi/ic_history_white_drawable_24dp.png | bin | 0 -> 525 bytes | |||
-rw-r--r-- | res/drawable-mdpi/ic_history_white_drawable_24dp.png | bin | 0 -> 340 bytes | |||
-rw-r--r-- | res/drawable-xhdpi/ic_history_white_drawable_24dp.png | bin | 0 -> 659 bytes | |||
-rw-r--r-- | res/drawable-xxhdpi/ic_history_white_drawable_24dp.png | bin | 0 -> 971 bytes | |||
-rw-r--r-- | res/drawable-xxxhdpi/ic_call_note_white_24dp.png | bin | 0 -> 1633 bytes | |||
-rw-r--r-- | res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png | bin | 0 -> 1311 bytes | |||
-rw-r--r-- | res/layout/dialog_call_subject.xml | 129 | ||||
-rw-r--r-- | res/values/colors.xml | 12 | ||||
-rw-r--r-- | res/values/dimens.xml | 14 | ||||
-rw-r--r-- | res/values/strings.xml | 20 | ||||
-rw-r--r-- | res/values/styles.xml | 10 | ||||
-rw-r--r-- | src/com/android/contacts/common/CallUtil.java | 15 | ||||
-rw-r--r-- | src/com/android/contacts/common/dialog/CallSubjectDialog.java | 299 | ||||
-rw-r--r-- | src/com/android/contacts/common/util/UriUtils.java | 20 |
14 files changed, 519 insertions, 0 deletions
diff --git a/res/drawable-hdpi/ic_history_white_drawable_24dp.png b/res/drawable-hdpi/ic_history_white_drawable_24dp.png Binary files differnew file mode 100644 index 00000000..703d30b9 --- /dev/null +++ b/res/drawable-hdpi/ic_history_white_drawable_24dp.png diff --git a/res/drawable-mdpi/ic_history_white_drawable_24dp.png b/res/drawable-mdpi/ic_history_white_drawable_24dp.png Binary files differnew file mode 100644 index 00000000..b3000d31 --- /dev/null +++ b/res/drawable-mdpi/ic_history_white_drawable_24dp.png diff --git a/res/drawable-xhdpi/ic_history_white_drawable_24dp.png b/res/drawable-xhdpi/ic_history_white_drawable_24dp.png Binary files differnew file mode 100644 index 00000000..e188d4a3 --- /dev/null +++ b/res/drawable-xhdpi/ic_history_white_drawable_24dp.png diff --git a/res/drawable-xxhdpi/ic_history_white_drawable_24dp.png b/res/drawable-xxhdpi/ic_history_white_drawable_24dp.png Binary files differnew file mode 100644 index 00000000..f44df1af --- /dev/null +++ b/res/drawable-xxhdpi/ic_history_white_drawable_24dp.png diff --git a/res/drawable-xxxhdpi/ic_call_note_white_24dp.png b/res/drawable-xxxhdpi/ic_call_note_white_24dp.png Binary files differnew file mode 100644 index 00000000..3a84a360 --- /dev/null +++ b/res/drawable-xxxhdpi/ic_call_note_white_24dp.png diff --git a/res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png b/res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png Binary files differnew file mode 100644 index 00000000..5b96af5b --- /dev/null +++ b/res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png diff --git a/res/layout/dialog_call_subject.xml b/res/layout/dialog_call_subject.xml new file mode 100644 index 00000000..3b7adddf --- /dev/null +++ b/res/layout/dialog_call_subject.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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 + --> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" > + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:layout_marginStart="@dimen/call_subject_dialog_margin" + android:layout_marginEnd="@dimen/call_subject_dialog_margin" + android:layout_marginTop="@dimen/call_subject_dialog_margin"> + + <QuickContactBadge + android:id="@+id/contact_photo" + android:layout_width="@dimen/call_subject_dialog_contact_photo_size" + android:layout_height="@dimen/call_subject_dialog_contact_photo_size" + android:layout_gravity="top" + android:focusable="true" + android:layout_marginEnd="@dimen/call_subject_dialog_margin" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:gravity="center_vertical"> + + <TextView + android:id="@+id/name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/dialtacts_primary_text_color" + android:textSize="@dimen/call_subject_dialog_secondary_text_size" + android:singleLine="true" /> + + <TextView + android:id="@+id/number" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginTop="@dimen/call_subject_dialog_between_line_margin" + android:textColor="@color/dialtacts_secondary_text_color" + android:textSize="@dimen/call_subject_dialog_secondary_text_size" + android:singleLine="true" /> + </LinearLayout> + </LinearLayout> + + <EditText + android:id="@+id/call_subject" + android:hint="@string/call_subject_hint" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_gravity="top" + android:textColor="@color/dialtacts_secondary_text_color" + android:textSize="@dimen/call_subject_dialog_secondary_text_size" + android:gravity="top" + android:background="@null" + android:layout_marginTop="@dimen/call_subject_dialog_edit_spacing" + android:layout_marginStart="@dimen/call_subject_dialog_margin" + android:layout_marginEnd="@dimen/call_subject_dialog_margin" + /> + + <TextView + android:id="@+id/character_limit" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/dialtacts_secondary_text_color" + android:textSize="@dimen/call_subject_dialog_secondary_text_size" + android:singleLine="true" + android:layout_marginStart="@dimen/call_subject_dialog_margin" + android:layout_marginEnd="@dimen/call_subject_dialog_margin" + android:layout_marginTop="@dimen/call_subject_dialog_margin" + android:layout_marginBottom="@dimen/call_subject_dialog_margin"/> + + <View + android:layout_width="fill_parent" + android:layout_height="1dp" + android:background="@color/call_subject_divider"/> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:layout_marginStart="@dimen/call_subject_dialog_margin" + android:layout_marginEnd="@dimen/call_subject_dialog_margin" + android:layout_marginTop="@dimen/call_subject_dialog_margin" + android:layout_marginBottom="@dimen/call_subject_dialog_margin"> + + <ImageView + android:id="@+id/history_button" + android:layout_width="25dp" + android:layout_height="25dp" + android:src="@drawable/ic_history_white_drawable_24dp" + android:tint="@color/call_subject_history_icon" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" /> + + <TextView + android:id="@+id/send_and_call_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/send_and_call_button" + android:textColor="@color/call_subject_button" + android:textSize="@dimen/call_subject_dialog_secondary_text_size" + android:singleLine="true" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" /> + + </RelativeLayout> +</LinearLayout>
\ No newline at end of file diff --git a/res/values/colors.xml b/res/values/colors.xml index e50be6a9..7c212680 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -151,4 +151,16 @@ <!-- Color of the background of the contact detail and editor pages --> <color name="background_primary">#f9f9f9</color> <color name="contact_all_list_background_color">#FFFFFF</color> + + <!-- Text color used for character counter when the max limit has been exceeded --> + <color name="call_subject_limit_exceeded">#d1041c</color> + + <!-- Tint color for the call subhect history icon. --> + <color name="call_subject_history_icon">#000000</color> + + <!-- Divider line on the call subhect dialog. --> + <color name="call_subject_divider">#d8d8d8</color> + + <!-- Text color for the SEND & CALL button on the call subject dialog. --> + <color name="call_subject_button">#00c853</color> </resources> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index f06cd215..fd380243 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -145,4 +145,18 @@ <dimen name="search_shortcut_radius">40dp</dimen> <dimen name="contact_list_card_elevation">2dp</dimen> + + <!-- Padding used around the periphery of the call subject dialog, as well as in between the + items. --> + <dimen name="call_subject_dialog_margin">20dp</dimen> + <!-- Padding used between lines of text in the call subject dialog. --> + <dimen name="call_subject_dialog_between_line_margin">8dp</dimen> + <!-- Size of the contact photo in the call subject dialog. --> + <dimen name="call_subject_dialog_contact_photo_size">50dp</dimen> + <!-- Margin above the edit text in the call subject dialog. --> + <dimen name="call_subject_dialog_edit_spacing">60dp</dimen> + <!-- Size of primary text in the call subject dialog. --> + <dimen name="call_subject_dialog_primary_text_size">16sp</dimen> + <!-- Size of secondary text in the call subject dialog. --> + <dimen name="call_subject_dialog_secondary_text_size">14sp</dimen> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index c3725a39..e3fc6438 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -755,4 +755,24 @@ a ren't members of any other group. [CHAR LIMIT=25] --> <!-- Title for dialog to select Phone Account for outgoing call. [CHAR LIMIT=40] --> <string name="select_phone_account_for_calls">Call with</string> + + <!-- String used for actions in the dialer call log and the quick contact card to initiate + a call to an individual. The user is prompted to enter a note which is sent along with + the call (e.g. a call subject). [CHAR LIMIT=40] --> + <string name="call_with_a_note">Call with a note</string> + + <!-- Hint text shown in the call subject dialog. [CHAR LIMIT=255] --> + <string name="call_subject_hint">Type a note to send with call ...</string> + + <!-- Button used to start a new call with the user entered subject. [CHAR LIMIT=32] --> + <string name="send_and_call_button">SEND & CALL</string> + + <!-- String used to represent the total number of characters entered for a call subject, + compared to the character limit. Example: 2 / 64 --> + <string name="call_subject_limit"><xliff:g id="count" example="4">%1$s</xliff:g> / <xliff:g id="limit" example="64">%2$s</xliff:g></string> + + <!-- String used to build a phone number bype and phone number string. + Example: Mobile • 650-555-1212 --> + <string name="call_subject_type_and_number"><xliff:g id="type" example="Mobile">%1$s</xliff:g> • <xliff:g id="number" example="(650) 555-1212">%2$s</xliff:g></string> + </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index 7e1127d4..94916b88 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -88,4 +88,14 @@ background and text color. See also android:style/Widget.Holo.TextView.ListSepar <item name="android:windowNoDisplay">false</item> <item name="android:windowIsFloating">true</item> </style> + + <style name="CallSubjectDialogTheme" parent="android:Theme.Material.Light.Dialog"> + <item name="android:layout_width">fill_parent</item> + <item name="android:layout_height">fill_parent</item> + + <!-- No backgrounds, titles or window float --> + <item name="android:windowNoTitle">true</item> + <item name="android:windowFullscreen">true</item> + <item name="android:windowIsFloating">true</item> + </style> </resources> diff --git a/src/com/android/contacts/common/CallUtil.java b/src/com/android/contacts/common/CallUtil.java index 18b80402..4f945523 100644 --- a/src/com/android/contacts/common/CallUtil.java +++ b/src/com/android/contacts/common/CallUtil.java @@ -42,6 +42,21 @@ public class CallUtil { * Return an Intent for making a phone call. Scheme (e.g. tel, sip) will be determined * automatically. */ + public static Intent getCallWithSubjectIntent(String number, + PhoneAccountHandle phoneAccountHandle, String callSubject) { + + final Intent intent = getCallIntent(getCallUri(number)); + intent.putExtra(TelecomManager.EXTRA_CALL_SUBJECT, callSubject); + if (phoneAccountHandle != null) { + intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + } + return intent; + } + + /** + * Return an Intent for making a phone call. Scheme (e.g. tel, sip) will be determined + * automatically. + */ public static Intent getCallIntent(String number) { return getCallIntent(getCallUri(number)); } diff --git a/src/com/android/contacts/common/dialog/CallSubjectDialog.java b/src/com/android/contacts/common/dialog/CallSubjectDialog.java new file mode 100644 index 00000000..fb13940a --- /dev/null +++ b/src/com/android/contacts/common/dialog/CallSubjectDialog.java @@ -0,0 +1,299 @@ +/* + * 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.contacts.common.dialog; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.FragmentTransaction; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.QuickContactBadge; +import android.widget.TextView; + +import com.android.contacts.common.CallUtil; +import com.android.contacts.common.ContactPhotoManager; +import com.android.contacts.common.R; +import com.android.contacts.common.util.UriUtils; + +/** + * Implements a dialog which prompts for a call subject for an outgoing call. + */ +public class CallSubjectDialog extends DialogFragment { + private static final String TAG = "CallSubjectDialog"; + private static final String FRAGMENT_TAG = "callSubject"; + private static final int CALL_SUBJECT_LIMIT = 16; + + /** + * Fragment argument bundle keys: + */ + private static final String ARG_PHOTO_ID = "PHOTO_ID"; + private static final String ARG_PHOTO_URI = "PHOTO_URI"; + private static final String ARG_CONTACT_URI = "CONTACT_URI"; + private static final String ARG_NAME_OR_NUMBER = "NAME_OR_NUMBER"; + private static final String ARG_IS_BUSINESS = "IS_BUSINESS"; + private static final String ARG_NUMBER = "NUMBER"; + private static final String ARG_DISPLAY_NUMBER = "DISPLAY_NUMBER"; + private static final String ARG_NUMBER_LABEL = "NUMBER_LABEL"; + private static final String ARG_PHONE_ACCOUNT_HANDLE = "PHONE_ACCOUNT_HANDLE"; + + private Context mContext; + private QuickContactBadge mContactPhoto; + private TextView mNameView; + private TextView mNumberView; + private EditText mCallSubjectView; + private TextView mCharacterLimitView; + private View mHistoryButton; + private View mSendAndCallButton; + + private int mLimit = CALL_SUBJECT_LIMIT; + private int mPhotoSize; + + private long mPhotoID; + private Uri mPhotoUri; + private Uri mContactUri; + private String mNameOrNumber; + private boolean mIsBusiness; + private String mNumber; + private String mDisplayNumber; + private String mNumberLabel; + private PhoneAccountHandle mPhoneAccountHandle; + + /** + * Handles changes to the text in the subject box. Ensures the character limit is updated. + */ + private final TextWatcher mTextWatcher = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // no-op + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + updateCharacterLimit(); + } + + @Override + public void afterTextChanged(Editable s) { + // no-op + } + }; + + /** + * Handles displaying the list of past call subjects. + */ + private final View.OnClickListener mHistoryOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + // TODO: Implement this (future CL). + } + }; + + /** + * Handles starting a call with a call subject specified. + */ + private final View.OnClickListener mSendAndCallOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = CallUtil.getCallWithSubjectIntent(mNumber, mPhoneAccountHandle, + mCallSubjectView.getText().toString()); + + final TelecomManager tm = + (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); + tm.placeCall(intent.getData(), intent.getExtras()); + getDialog().dismiss(); + } + }; + + /** + * Creates a call subject dialog. + * + * @param activity The current activity. + * @param photoId The photo ID (used to populate contact photo). + * @param photoUri The photo Uri (used to populate contact photo). + * @param contactUri The Contact URI (used so quick contact can be invoked from contact photo). + * @param nameOrNumber The name or number of the callee. + * @param isBusiness {@code true} if a business is being called (used for contact photo). + * @param number The raw number to dial. + * @param displayNumber The number to dial, formatted for display. + * @param numberLabel The label for the number (if from a contact). + * @param phoneAccountHandle The phone account handle. + */ + public static void start(Activity activity, long photoId, Uri photoUri, Uri contactUri, + String nameOrNumber, boolean isBusiness, String number, String displayNumber, + String numberLabel, PhoneAccountHandle phoneAccountHandle) { + final FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); + final CallSubjectDialog fragment = new CallSubjectDialog(); + Bundle arguments = new Bundle(); + arguments.putLong(ARG_PHOTO_ID, photoId); + arguments.putParcelable(ARG_PHOTO_URI, photoUri); + arguments.putParcelable(ARG_CONTACT_URI, contactUri); + arguments.putString(ARG_NAME_OR_NUMBER, nameOrNumber); + arguments.putBoolean(ARG_IS_BUSINESS, isBusiness); + arguments.putString(ARG_NUMBER, number); + arguments.putString(ARG_DISPLAY_NUMBER, displayNumber); + arguments.putString(ARG_NUMBER_LABEL, numberLabel); + arguments.putParcelable(ARG_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + fragment.setArguments(arguments); + fragment.show(ft, FRAGMENT_TAG); + } + + /** + * Creates the dialog, inflating the layout and populating it with the name and phone number. + * + * @param savedInstanceState The last saved instance state of the Fragment, + * or null if this is a freshly created Fragment. + * + * @return Dialog instance. + */ + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + mContext = getActivity(); + mPhotoSize = mContext.getResources().getDimensionPixelSize( + R.dimen.call_subject_dialog_contact_photo_size); + readArguments(); + + LayoutInflater inflater = getActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.dialog_call_subject, null); + + mContactPhoto = (QuickContactBadge) view.findViewById(R.id.contact_photo); + mNameView = (TextView) view.findViewById(R.id.name); + mNumberView = (TextView) view.findViewById(R.id.number); + mCallSubjectView = (EditText) view.findViewById(R.id.call_subject); + mCallSubjectView.addTextChangedListener(mTextWatcher); + mCharacterLimitView = (TextView) view.findViewById(R.id.character_limit); + mHistoryButton = view.findViewById(R.id.history_button); + mHistoryButton.setOnClickListener(mHistoryOnClickListener); + mSendAndCallButton = view.findViewById(R.id.send_and_call_button); + mSendAndCallButton.setOnClickListener(mSendAndCallOnClickListener); + + updateContactInfo(); + updateCharacterLimit(); + + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()); + dialogBuilder.setView(view); + final AlertDialog dialog = dialogBuilder.create(); + + dialog.getWindow().setLayout(ViewGroup.LayoutParams.FILL_PARENT, + ViewGroup.LayoutParams.FILL_PARENT); + return dialogBuilder.create(); + } + + /** + * Populates the contact info fields based on the current contact information. + */ + private void updateContactInfo() { + setPhoto(mPhotoID, mPhotoUri, mContactUri, mNameOrNumber, mIsBusiness); + mNameView.setText(mNameOrNumber); + if (!TextUtils.isEmpty(mNumberLabel) && !TextUtils.isEmpty(mDisplayNumber)) { + mNumberView.setVisibility(View.VISIBLE); + mNumberView.setText(mContext.getString(R.string.call_subject_type_and_number, mNumberLabel, + mDisplayNumber)); + } else { + mNumberView.setVisibility(View.GONE); + mNumberView.setText(null); + } + } + + /** + * Reads arguments from the fragment arguments and populates the necessary instance variables. + */ + private void readArguments() { + Bundle arguments = getArguments(); + if (arguments == null) { + Log.e(TAG, "Arguments cannot be null."); + } + mPhotoID = arguments.getLong(ARG_PHOTO_ID); + mPhotoUri = arguments.getParcelable(ARG_PHOTO_URI); + mContactUri = arguments.getParcelable(ARG_CONTACT_URI); + mNameOrNumber = arguments.getString(ARG_NAME_OR_NUMBER); + mIsBusiness = arguments.getBoolean(ARG_IS_BUSINESS); + mNumber = arguments.getString(ARG_NUMBER); + mDisplayNumber = arguments.getString(ARG_DISPLAY_NUMBER); + mNumberLabel = arguments.getString(ARG_NUMBER_LABEL); + mPhoneAccountHandle = arguments.getParcelable(ARG_PHONE_ACCOUNT_HANDLE); + } + + /** + * Updates the character limit display, coloring the text RED when the limit is reached or + * exceeded. + */ + private void updateCharacterLimit() { + int length = mCallSubjectView.length(); + mCharacterLimitView.setText( + mContext.getString(R.string.call_subject_limit, length, mLimit)); + if (length >= mLimit) { + mCharacterLimitView.setTextColor(mContext.getResources().getColor( + R.color.call_subject_limit_exceeded)); + } else { + mCharacterLimitView.setTextColor(mContext.getResources().getColor( + R.color.dialtacts_secondary_text_color)); + } + } + + /** + * Sets the photo on the quick contact photo. + * + * @param photoId + * @param photoUri + * @param contactUri + * @param displayName + * @param isBusiness + */ + private void setPhoto(long photoId, Uri photoUri, Uri contactUri, String displayName, + boolean isBusiness) { + mContactPhoto.assignContactUri(contactUri); + mContactPhoto.setOverlay(null); + + int contactType; + if (isBusiness) { + contactType = ContactPhotoManager.TYPE_BUSINESS; + } else { + contactType = ContactPhotoManager.TYPE_DEFAULT; + } + + String lookupKey = null; + if (contactUri != null) { + lookupKey = UriUtils.getLookupKeyFromUri(contactUri); + } + + ContactPhotoManager.DefaultImageRequest + request = new ContactPhotoManager.DefaultImageRequest( + displayName, lookupKey, contactType, true /* isCircular */); + + if (photoId == 0 && photoUri != null) { + ContactPhotoManager.getInstance(mContext).loadPhoto(mContactPhoto, photoUri, + mPhotoSize, false /* darkTheme */, true /* isCircular */, request); + } else { + ContactPhotoManager.getInstance(mContext).loadThumbnail(mContactPhoto, photoId, + false /* darkTheme */, true /* isCircular */, request); + } + } +} diff --git a/src/com/android/contacts/common/util/UriUtils.java b/src/com/android/contacts/common/util/UriUtils.java index 1ede5f3a..41ef62f6 100644 --- a/src/com/android/contacts/common/util/UriUtils.java +++ b/src/com/android/contacts/common/util/UriUtils.java @@ -19,6 +19,8 @@ package com.android.contacts.common.util; import android.net.Uri; import android.provider.ContactsContract; +import java.util.List; + /** * Utility methods for dealing with URIs. */ @@ -71,4 +73,22 @@ public class UriUtils { } return ContactsContract.AUTHORITY.equals(uri.getAuthority()) ? uri : null; } + + /** + * Parses the given URI to determine the original lookup key of the contact. + */ + public static String getLookupKeyFromUri(Uri lookupUri) { + // Would be nice to be able to persist the lookup key somehow to avoid having to parse + // the uri entirely just to retrieve the lookup key, but every uri is already parsed + // once anyway to check if it is an encoded JSON uri, so this has negligible effect + // on performance. + if (lookupUri != null && !UriUtils.isEncodedContactUri(lookupUri)) { + final List<String> segments = lookupUri.getPathSegments(); + // This returns the third path segment of the uri, where the lookup key is located. + // See {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}. + return (segments.size() < 3) ? null : Uri.encode(segments.get(2)); + } else { + return null; + } + } } |