/* * Copyright (C) 2009 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.editor; import android.content.ContentUris; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.RawContacts; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.android.contacts.R; import com.android.contacts.common.GeoUtil; import com.android.contacts.common.compat.PhoneNumberUtilsCompat; import com.android.contacts.common.model.RawContactModifier; import com.android.contacts.common.model.RawContactDelta; import com.android.contacts.common.model.ValuesDelta; import com.android.contacts.common.model.account.AccountType; import com.android.contacts.common.model.account.AccountWithDataSet; import com.android.contacts.common.model.dataitem.DataKind; import java.util.ArrayList; /** * Custom view that displays external contacts in the edit screen. */ public class RawContactReadOnlyEditorView extends BaseRawContactEditorView implements OnClickListener { private LayoutInflater mInflater; private TextView mName; private Button mEditExternallyButton; private ViewGroup mGeneral; private TextView mAccountHeaderTypeTextView; private TextView mAccountHeaderNameTextView; private ImageView mAccountIconImageView; private String mAccountName; private String mAccountType; private String mDataSet; private long mRawContactId = -1; public RawContactReadOnlyEditorView(Context context) { super(context); } public RawContactReadOnlyEditorView(Context context, AttributeSet attrs) { super(context, attrs); } /** {@inheritDoc} */ @Override protected void onFinishInflate() { super.onFinishInflate(); mInflater = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); mName = (TextView) findViewById(R.id.read_only_name); mEditExternallyButton = (Button) findViewById(R.id.button_edit_externally); mEditExternallyButton.setOnClickListener(this); mGeneral = (ViewGroup)findViewById(R.id.sect_general); mAccountHeaderTypeTextView = (TextView) findViewById(R.id.account_type); mAccountHeaderNameTextView = (TextView) findViewById(R.id.account_name); mAccountIconImageView = (ImageView) findViewById(android.R.id.icon); } /** * Set the internal state for this view, given a current * {@link RawContactDelta} state and the {@link AccountType} that * apply to that state. */ @Override public void setState(RawContactDelta state, AccountType type, ViewIdGenerator vig, boolean isProfile) { // Remove any existing sections mGeneral.removeAllViews(); // Bail if invalid state or source if (state == null || type == null) return; // Make sure we have StructuredName RawContactModifier.ensureKindExists(state, type, StructuredName.CONTENT_ITEM_TYPE); // Fill in the header info mAccountName = state.getAccountName(); mAccountType = state.getAccountType(); mDataSet = state.getDataSet(); final Pair<String,String> accountInfo = isProfile ? EditorUiUtils.getLocalAccountInfo(getContext(), state.getAccountName(), type) : EditorUiUtils.getAccountInfo(getContext(), state.getAccountName(), type); if (accountInfo.first == null) { // Hide this view so the other text view will be centered vertically mAccountHeaderNameTextView.setVisibility(View.GONE); } else { mAccountHeaderNameTextView.setVisibility(View.VISIBLE); mAccountHeaderNameTextView.setText(accountInfo.first); } mAccountHeaderTypeTextView.setText(accountInfo.second); updateAccountHeaderContentDescription(); mAccountIconImageView.setImageDrawable(state.getRawContactAccountType(getContext()) .getDisplayIcon(getContext())); // TODO: Expose data set in the UI somehow? mRawContactId = state.getRawContactId(); ValuesDelta primary; // Photo DataKind kind = type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE); if (kind != null) { RawContactModifier.ensureKindExists(state, type, Photo.CONTENT_ITEM_TYPE); boolean hasPhotoEditor = type.getKindForMimetype(Photo.CONTENT_ITEM_TYPE) != null; setHasPhotoEditor(hasPhotoEditor); primary = state.getPrimaryEntry(Photo.CONTENT_ITEM_TYPE); getPhotoEditor().setValues(kind, primary, state, !type.areContactsWritable(), vig); } // Name primary = state.getPrimaryEntry(StructuredName.CONTENT_ITEM_TYPE); mName.setText(primary != null ? primary.getAsString(StructuredName.DISPLAY_NAME) : getContext().getString(R.string.missing_name)); if (type.getEditContactActivityClassName() != null) { mEditExternallyButton.setVisibility(View.VISIBLE); } else { mEditExternallyButton.setVisibility(View.GONE); } final Resources res = getContext().getResources(); // Phones final ArrayList<ValuesDelta> phones = state.getMimeEntries(Phone.CONTENT_ITEM_TYPE); final Drawable phoneDrawable = getResources().getDrawable(R.drawable.ic_phone_24dp); final String phoneContentDescription = res.getString(R.string.header_phone_entry); if (phones != null) { boolean isFirstPhoneBound = true; for (ValuesDelta phone : phones) { final String phoneNumber = phone.getPhoneNumber(); if (TextUtils.isEmpty(phoneNumber)) { continue; } final String formattedNumber = PhoneNumberUtilsCompat.formatNumber( phoneNumber, phone.getPhoneNormalizedNumber(), GeoUtil.getCurrentCountryIso(getContext())); CharSequence phoneType = null; if (phone.hasPhoneType()) { phoneType = Phone.getTypeLabel( res, phone.getPhoneType(), phone.getPhoneLabel()); } bindData(phoneDrawable, phoneContentDescription, formattedNumber, phoneType, isFirstPhoneBound, true); isFirstPhoneBound = false; } } // Emails final ArrayList<ValuesDelta> emails = state.getMimeEntries(Email.CONTENT_ITEM_TYPE); final Drawable emailDrawable = getResources().getDrawable(R.drawable.ic_email_24dp); final String emailContentDescription = res.getString(R.string.header_email_entry); if (emails != null) { boolean isFirstEmailBound = true; for (ValuesDelta email : emails) { final String emailAddress = email.getEmailData(); if (TextUtils.isEmpty(emailAddress)) { continue; } CharSequence emailType = null; if (email.hasEmailType()) { emailType = Email.getTypeLabel( res, email.getEmailType(), email.getEmailLabel()); } bindData(emailDrawable, emailContentDescription, emailAddress, emailType, isFirstEmailBound); isFirstEmailBound = false; } } // Hide mGeneral if it's empty if (mGeneral.getChildCount() > 0) { mGeneral.setVisibility(View.VISIBLE); } else { mGeneral.setVisibility(View.GONE); } } private void bindData(Drawable icon, String iconContentDescription, CharSequence data, CharSequence type, boolean isFirstEntry) { bindData(icon, iconContentDescription, data, type, isFirstEntry, false); } private void bindData(Drawable icon, String iconContentDescription, CharSequence data, CharSequence type, boolean isFirstEntry, boolean forceLTR) { final View field = mInflater.inflate(R.layout.item_read_only_field, mGeneral, false); if (isFirstEntry) { final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon); imageView.setImageDrawable(icon); imageView.setContentDescription(iconContentDescription); } else { final ImageView imageView = (ImageView) field.findViewById(R.id.kind_icon); imageView.setVisibility(View.INVISIBLE); imageView.setContentDescription(null); } final TextView dataView = (TextView) field.findViewById(R.id.data); dataView.setText(data); if (forceLTR) { dataView.setTextDirection(View.TEXT_DIRECTION_LTR); } final TextView typeView = (TextView) field.findViewById(R.id.type); if (!TextUtils.isEmpty(type)) { typeView.setText(type); } else { typeView.setVisibility(View.GONE); } mGeneral.addView(field); } @Override public long getRawContactId() { return mRawContactId; } @Override public void onClick(View v) { if (v.getId() == R.id.button_edit_externally) { if (mListener != null) { mListener.onExternalEditorRequest( new AccountWithDataSet(mAccountName, mAccountType, mDataSet), ContentUris.withAppendedId(RawContacts.CONTENT_URI, mRawContactId)); } } } }