summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/drawable-hdpi/ic_history_white_drawable_24dp.pngbin0 -> 525 bytes
-rw-r--r--res/drawable-mdpi/ic_history_white_drawable_24dp.pngbin0 -> 340 bytes
-rw-r--r--res/drawable-xhdpi/ic_history_white_drawable_24dp.pngbin0 -> 659 bytes
-rw-r--r--res/drawable-xxhdpi/ic_history_white_drawable_24dp.pngbin0 -> 971 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_call_note_white_24dp.pngbin0 -> 1633 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_history_white_drawable_24dp.pngbin0 -> 1311 bytes
-rw-r--r--res/layout/dialog_call_subject.xml129
-rw-r--r--res/values/colors.xml12
-rw-r--r--res/values/dimens.xml14
-rw-r--r--res/values/strings.xml20
-rw-r--r--res/values/styles.xml10
-rw-r--r--src/com/android/contacts/common/CallUtil.java15
-rw-r--r--src/com/android/contacts/common/dialog/CallSubjectDialog.java299
-rw-r--r--src/com/android/contacts/common/util/UriUtils.java20
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
new file mode 100644
index 00000000..703d30b9
--- /dev/null
+++ b/res/drawable-hdpi/ic_history_white_drawable_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_history_white_drawable_24dp.png b/res/drawable-mdpi/ic_history_white_drawable_24dp.png
new file mode 100644
index 00000000..b3000d31
--- /dev/null
+++ b/res/drawable-mdpi/ic_history_white_drawable_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_history_white_drawable_24dp.png b/res/drawable-xhdpi/ic_history_white_drawable_24dp.png
new file mode 100644
index 00000000..e188d4a3
--- /dev/null
+++ b/res/drawable-xhdpi/ic_history_white_drawable_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_history_white_drawable_24dp.png b/res/drawable-xxhdpi/ic_history_white_drawable_24dp.png
new file mode 100644
index 00000000..f44df1af
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_history_white_drawable_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_call_note_white_24dp.png b/res/drawable-xxxhdpi/ic_call_note_white_24dp.png
new file mode 100644
index 00000000..3a84a360
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_call_note_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png b/res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png
new file mode 100644
index 00000000..5b96af5b
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_history_white_drawable_24dp.png
Binary files differ
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 &amp; 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;
+ }
+ }
}