/* * 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.Context; import android.database.Cursor; import android.os.Bundle; import android.os.Parcelable; import android.provider.ContactsContract.CommonDataKinds.GroupMembership; import android.provider.ContactsContract.CommonDataKinds.Nickname; import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.android.contacts.GroupMetaDataLoader; import com.android.contacts.R; import com.android.contacts.common.model.account.AccountType; import com.android.contacts.common.model.account.AccountType.EditType; import com.android.contacts.common.model.dataitem.DataKind; import com.android.contacts.common.model.RawContactDelta; import com.android.contacts.common.model.ValuesDelta; import com.android.contacts.common.model.RawContactModifier; import com.google.common.base.Objects; import java.util.ArrayList; /** * Custom view that provides all the editor interaction for a specific * {@link Contacts} represented through an {@link RawContactDelta}. Callers can * reuse this view and quickly rebuild its contents through * {@link #setState(RawContactDelta, AccountType, ViewIdGenerator)}. *
* Internal updates are performed against {@link ValuesDelta} so that the
* source {@link RawContact} can be swapped out. Any state-based changes, such as
* adding {@link Data} rows or changing {@link EditType}, are performed through
* {@link RawContactModifier} to ensure that {@link AccountType} are enforced.
*/
public class RawContactEditorView extends BaseRawContactEditorView {
private static final String KEY_SUPER_INSTANCE_STATE = "superInstanceState";
private LayoutInflater mInflater;
private StructuredNameEditorView mName;
private PhoneticNameEditorView mPhoneticName;
private TextFieldsEditorView mNickName;
private GroupMembershipView mGroupMembershipView;
private ViewGroup mFields;
private View mAccountSelector;
private TextView mAccountSelectorTypeTextView;
private TextView mAccountSelectorNameTextView;
private View mAccountHeader;
private TextView mAccountHeaderTypeTextView;
private TextView mAccountHeaderNameTextView;
private long mRawContactId = -1;
private boolean mAutoAddToDefaultGroup = true;
private Cursor mGroupMetaData;
private DataKind mGroupMembershipKind;
private RawContactDelta mState;
public RawContactEditorView(Context context) {
super(context);
}
public RawContactEditorView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
View view = getPhotoEditor();
if (view != null) {
view.setEnabled(enabled);
}
if (mName != null) {
mName.setEnabled(enabled);
}
if (mPhoneticName != null) {
mPhoneticName.setEnabled(enabled);
}
if (mFields != null) {
int count = mFields.getChildCount();
for (int i = 0; i < count; i++) {
mFields.getChildAt(i).setEnabled(enabled);
}
}
if (mGroupMembershipView != null) {
mGroupMembershipView.setEnabled(enabled);
}
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mName = (StructuredNameEditorView)findViewById(R.id.edit_name);
mName.setDeletable(false);
mPhoneticName = (PhoneticNameEditorView)findViewById(R.id.edit_phonetic_name);
mPhoneticName.setDeletable(false);
mNickName = (TextFieldsEditorView)findViewById(R.id.edit_nick_name);
mFields = (ViewGroup)findViewById(R.id.sect_fields);
mAccountHeader = findViewById(R.id.account_header_container);
mAccountHeaderTypeTextView = (TextView) findViewById(R.id.account_type);
mAccountHeaderNameTextView = (TextView) findViewById(R.id.account_name);
mAccountSelector = findViewById(R.id.account_selector_container);
mAccountSelectorTypeTextView = (TextView) findViewById(R.id.account_type_selector);
mAccountSelectorNameTextView = (TextView) findViewById(R.id.account_name_selector);
}
@Override
protected Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
// super implementation of onSaveInstanceState returns null
bundle.putParcelable(KEY_SUPER_INSTANCE_STATE, super.onSaveInstanceState());
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
Bundle bundle = (Bundle) state;
super.onRestoreInstanceState(bundle.getParcelable(KEY_SUPER_INSTANCE_STATE));
return;
}
super.onRestoreInstanceState(state);
}
/**
* 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) {
mState = state;
// Remove any existing sections
mFields.removeAllViews();
// Bail if invalid state or account type
if (state == null || type == null) return;
setId(vig.getId(state, null, null, ViewIdGenerator.NO_VIEW_INDEX));
// Make sure we have a StructuredName
RawContactModifier.ensureKindExists(state, type, StructuredName.CONTENT_ITEM_TYPE);
mRawContactId = state.getRawContactId();
// Fill in the account info
final Pair