diff options
author | Walter Jang <wjang@google.com> | 2015-06-18 23:15:31 -0700 |
---|---|---|
committer | Walter Jang <wjang@google.com> | 2015-06-19 16:27:42 -0700 |
commit | 2d3f31c210ffc617e82e3b41fc32b54ec2a5011a (patch) | |
tree | 97f9c89195c695e9ea51132806d81054d7c0ddc1 /src/com | |
parent | c90cc15b804fb00339a3b98e5c951549f9b03599 (diff) | |
download | Contacts-2d3f31c210ffc617e82e3b41fc32b54ec2a5011a.tar.gz |
Show account info for inserts and read-only contact edits
Bug 21637149
Change-Id: I224ab188230f119f49f4ab7ddef4b51c451aa892
Diffstat (limited to 'src/com')
7 files changed, 147 insertions, 37 deletions
diff --git a/src/com/android/contacts/editor/BaseRawContactEditorView.java b/src/com/android/contacts/editor/BaseRawContactEditorView.java index 01742bba1..e99af619f 100644 --- a/src/com/android/contacts/editor/BaseRawContactEditorView.java +++ b/src/com/android/contacts/editor/BaseRawContactEditorView.java @@ -197,12 +197,8 @@ public abstract class BaseRawContactEditorView extends LinearLayout { protected void updateAccountHeaderContentDescription() { final StringBuilder builder = new StringBuilder(); - if (!TextUtils.isEmpty(mAccountType.getText())) { - builder.append(mAccountType.getText()).append('\n'); - } - if (!TextUtils.isEmpty(mAccountName.getText())) { - builder.append(mAccountName.getText()).append('\n'); - } + builder.append(EditorUiUtils.getAccountInfoContentDescription( + mAccountName.getText(), mAccountType.getText())); if (mExpandAccountButton.getVisibility() == View.VISIBLE) { builder.append(getResources().getString(isCollapsed() ? R.string.content_description_expand_editor diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java index 12b3b623e..656c5ae78 100644 --- a/src/com/android/contacts/editor/CompactContactEditorFragment.java +++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java @@ -209,7 +209,7 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl final CompactRawContactsEditorView editorView = getContent(); editorView.setListener(this); editorView.setState(mState, getMaterialPalette(), mViewIdGenerator, mPhotoId, mNameId, - mReadOnlyDisplayName); + mReadOnlyDisplayName, mHasNewContact, mIsUserProfile); if (mReadOnlyDisplayName != null) { mReadOnlyNameEditorView = editorView.getDefaultNameEditorView(); } diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java index d12ef6d88..ca2aa9300 100644 --- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java +++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java @@ -24,6 +24,7 @@ import com.android.contacts.common.model.RawContactModifier; import com.android.contacts.common.model.ValuesDelta; import com.android.contacts.common.model.account.AccountType; import com.android.contacts.common.model.account.AccountType.EditField; +import com.android.contacts.common.model.account.AccountWithDataSet; import com.android.contacts.common.model.dataitem.DataKind; import com.android.contacts.common.util.MaterialColorMapUtils; import com.android.contacts.editor.CompactContactEditorFragment.PhotoHandler; @@ -40,10 +41,12 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; +import android.widget.TextView; import java.util.ArrayList; import java.util.List; @@ -123,6 +126,9 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O private ViewIdGenerator mViewIdGenerator; private MaterialColorMapUtils.MaterialPalette mMaterialPalette; + private View mAccountContainer; + private TextView mAccountTypeView; + private TextView mAccountNameView; private CompactPhotoEditorView mPhoto; private ViewGroup mNames; private ViewGroup mPhoneticNames; @@ -162,6 +168,9 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O mLayoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mAccountContainer = findViewById(R.id.account_container); + mAccountTypeView = (TextView) findViewById(R.id.account_type); + mAccountNameView = (TextView) findViewById(R.id.account_name); mPhoto = (CompactPhotoEditorView) findViewById(R.id.photo_editor); mNames = (LinearLayout) findViewById(R.id.names); mPhoneticNames = (LinearLayout) findViewById(R.id.phonetic_names); @@ -266,7 +275,8 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O */ public void setState(RawContactDeltaList rawContactDeltas, MaterialColorMapUtils.MaterialPalette materialPalette, ViewIdGenerator viewIdGenerator, - long photoId, long nameId, String readOnlyDisplayName) { + long photoId, long nameId, String readOnlyDisplayName, boolean hasNewContact, + boolean isUserProfile) { mNames.removeAllViews(); mPhoneticNames.removeAllViews(); mNicknames.removeAllViews(); @@ -284,6 +294,7 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O mMaterialPalette = materialPalette; vlog("Setting compact editor state from " + rawContactDeltas); + addAccountInfo(rawContactDeltas, hasNewContact, readOnlyDisplayName, isUserProfile); addPhotoView(rawContactDeltas, viewIdGenerator, photoId, readOnlyDisplayName); addStructuredNameView(rawContactDeltas, nameId, readOnlyDisplayName); addEditorViews(rawContactDeltas); @@ -291,6 +302,71 @@ public class CompactRawContactsEditorView extends LinearLayout implements View.O removeExtraEmptyTextFields(mEmails); } + private void addAccountInfo(RawContactDeltaList rawContactDeltas, boolean hasNewContact, + String readOnlyDisplayName, boolean isUserProfile) { + // Only show account info for inserts and first time edits of read-only accounts + if (!hasNewContact && TextUtils.isEmpty(readOnlyDisplayName)) { + vlog("Account info hidden"); + mAccountContainer.setVisibility(View.GONE); + return; + } + + // Get the default account + final AccountWithDataSet defaultAccountWithDataSet = + ContactEditorUtils.getInstance(getContext()).getDefaultAccount(); + if (defaultAccountWithDataSet == null) { + vlog("Account info hidden because default account not set"); + mAccountContainer.setVisibility(View.GONE); + return; + } + + // We can assume the first writable raw contact is the newly created one because + // inserts have a delta list of size 1 and read-only contacts are should be of size 2 + RawContactDelta defaultAccountRawContactDelta = null; + AccountType accountType = null; + for (RawContactDelta rawContactDelta : rawContactDeltas) { + if (!rawContactDelta.isVisible()) continue; + accountType = rawContactDelta.getAccountType(mAccountTypeManager); + if (accountType != null && accountType.areContactsWritable()) { + defaultAccountRawContactDelta = rawContactDelta; + break; + } + } + if (defaultAccountRawContactDelta == null) { + vlog("Account info hidden because no raw contact delta matched"); + mAccountContainer.setVisibility(View.GONE); + return; + } + if (accountType == null) { + vlog("Account info hidden because no account type returned from raw contact delta"); + mAccountContainer.setVisibility(View.GONE); + return; + } + + // Get the account information for the default account RawContactDelta + final Pair<String,String> accountInfo = EditorUiUtils.getAccountInfo(getContext(), + isUserProfile, defaultAccountRawContactDelta.getAccountName(), + accountType.getDisplayLabel(getContext())); + + // Set the account information already + if (accountInfo == null) { + vlog("Account info hidden because no account info could be composed"); + mAccountContainer.setVisibility(View.GONE); + return; + } + vlog("Account info loaded"); + if (accountInfo.first == null) { + mAccountNameView.setVisibility(View.GONE); + } else { + mAccountNameView.setVisibility(View.VISIBLE); + mAccountNameView.setText(accountInfo.first); + } + mAccountTypeView.setText(accountInfo.second); + + mAccountContainer.setContentDescription(EditorUiUtils.getAccountInfoContentDescription( + accountInfo.first, accountInfo.second)); + } + private void addPhotoView(RawContactDeltaList rawContactDeltas, ViewIdGenerator viewIdGenerator, long photoId, String readOnlyDisplayName) { // If we're editing a read-only contact, the display name from the read-only diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java index 434ed56b1..2935ad5a7 100644 --- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java +++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java @@ -124,6 +124,7 @@ abstract public class ContactEditorBaseFragment extends Fragment implements private static final String KEY_HAS_NEW_CONTACT = "hasNewContact"; private static final String KEY_NEW_CONTACT_READY = "newContactDataReady"; + private static final String KEY_NEW_CONTACT_ACCOUNT_CHANGED = "newContactAccountChanged"; private static final String KEY_IS_EDIT = "isEdit"; private static final String KEY_EXISTING_CONTACT_READY = "existingContactDataReady"; @@ -348,6 +349,7 @@ abstract public class ContactEditorBaseFragment extends Fragment implements // Whether to show the new contact blank form and if it's corresponding delta is ready. protected boolean mHasNewContact; protected boolean mNewContactDataReady; + protected boolean mNewContactAccountChanged; // Whether it's an edit of existing contact and if it's corresponding delta is ready. protected boolean mIsEdit; @@ -488,6 +490,7 @@ abstract public class ContactEditorBaseFragment extends Fragment implements mHasNewContact = savedState.getBoolean(KEY_HAS_NEW_CONTACT); mNewContactDataReady = savedState.getBoolean(KEY_NEW_CONTACT_READY); + mNewContactAccountChanged = savedState.getBoolean(KEY_NEW_CONTACT_ACCOUNT_CHANGED); mIsEdit = savedState.getBoolean(KEY_IS_EDIT); mExistingContactDataReady = savedState.getBoolean(KEY_EXISTING_CONTACT_READY); @@ -613,6 +616,7 @@ abstract public class ContactEditorBaseFragment extends Fragment implements outState.putInt(KEY_STATUS, mStatus); outState.putBoolean(KEY_HAS_NEW_CONTACT, mHasNewContact); outState.putBoolean(KEY_NEW_CONTACT_READY, mNewContactDataReady); + outState.putBoolean(KEY_NEW_CONTACT_ACCOUNT_CHANGED, mNewContactAccountChanged); outState.putBoolean(KEY_IS_EDIT, mIsEdit); outState.putBoolean(KEY_EXISTING_CONTACT_READY, mExistingContactDataReady); @@ -919,9 +923,10 @@ abstract public class ContactEditorBaseFragment extends Fragment implements mStatus = Status.SAVING; - // Determine if changes were made in the editor that need to be saved - // See go/editing-read-only-contacts - if (!hasPendingChanges()) { + // If the user did nothing else expect change the account type, we must still + // consider this as an unsaved change so the new rawcontact is passed back to the + // compact editor on inserts. + if (!mNewContactAccountChanged && !hasPendingChanges()) { if (mLookupUri == null && saveMode == SaveMode.RELOAD) { // We don't have anything to save and there isn't even an existing contact yet. // Nothing to do, simply go back to editing mode @@ -992,8 +997,8 @@ abstract public class ContactEditorBaseFragment extends Fragment implements if (mReadOnlyNameEditorView == null || mReadOnlyDisplayName == null) { return hasPendingRawContactChanges(); } - // We created a new raw contact delta with a default display name. We must test for - // pending changes while ignoring the default display name. + // We created a new raw contact delta with a default display name. + // We must test for pending changes while ignoring the default display name. final String displayName = mReadOnlyNameEditorView.getDisplayName(); if (mReadOnlyDisplayName.equals(displayName)) { // The user did not modify the default display name, erase it and diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java index 1e06306e4..4da17faf2 100644 --- a/src/com/android/contacts/editor/ContactEditorFragment.java +++ b/src/com/android/contacts/editor/ContactEditorFragment.java @@ -477,6 +477,7 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements UiClosables.closeQuietly(popup); AccountWithDataSet newAccount = adapter.getItem(position); if (!newAccount.equals(currentAccount)) { + mNewContactAccountChanged = true; rebindEditorsForNewContact(currentState, currentAccount, newAccount); } } diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java index f3cf20acf..301ce35bd 100644 --- a/src/com/android/contacts/editor/EditorUiUtils.java +++ b/src/com/android/contacts/editor/EditorUiUtils.java @@ -21,6 +21,9 @@ import static android.provider.ContactsContract.CommonDataKinds.GroupMembership; import static android.provider.ContactsContract.CommonDataKinds.Photo; import static android.provider.ContactsContract.CommonDataKinds.StructuredName; +import android.content.Context; +import android.text.TextUtils; +import android.util.Pair; import com.android.contacts.R; import com.android.contacts.common.model.dataitem.DataKind; import com.google.common.collect.Maps; @@ -76,4 +79,47 @@ public class EditorUiUtils { } return id; } + + /** + * Returns a Pair of the account name and type to display for the given arguments or null + * in no account information should be displayed. The account name may also be null. + */ + public static Pair<String,String> getAccountInfo(Context context, boolean isProfile, + String accountName, CharSequence accountType) { + if (isProfile) { + if (TextUtils.isEmpty(accountName)) { + return new Pair<>( + /* accountName =*/ null, + context.getString(R.string.local_profile_title)); + } else { + return new Pair<>( + accountName, + context.getString(R.string.external_profile_title, accountType)); + } + } else if (!TextUtils.isEmpty(accountName)) { + if (TextUtils.isEmpty(accountType)) { + accountType = context.getString(R.string.account_phone); + } + return new Pair<>( + context.getString(R.string.from_account_format, accountName), + context.getString(R.string.account_type_format, accountType)); + } + return null; + } + + /** + * Returns a content description String for the container of the account information + * returned by {@link #getAccountInfo}. + */ + public static String getAccountInfoContentDescription(CharSequence accountName, + CharSequence accountType) { + final StringBuilder builder = new StringBuilder(); + if (!TextUtils.isEmpty(accountType)) { + builder.append(accountType).append('\n'); + } + if (!TextUtils.isEmpty(accountName)) { + builder.append(accountName).append('\n'); + } + return builder.toString(); + } } diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java index d81dc4716..11f0c1ea8 100644 --- a/src/com/android/contacts/editor/RawContactEditorView.java +++ b/src/com/android/contacts/editor/RawContactEditorView.java @@ -28,6 +28,7 @@ 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; @@ -189,34 +190,19 @@ public class RawContactEditorView extends BaseRawContactEditorView { mRawContactId = state.getRawContactId(); // Fill in the account info - if (isProfile) { - String accountName = state.getAccountName(); - if (TextUtils.isEmpty(accountName)) { + final Pair<String,String> accountInfo = EditorUiUtils.getAccountInfo(getContext(), + isProfile, state.getAccountName(), type.getDisplayLabel(getContext())); + if (accountInfo == null) { + // Hide this view so the other text view will be centered vertically + mAccountHeaderNameTextView.setVisibility(View.GONE); + } else { + if (accountInfo.first == null) { mAccountHeaderNameTextView.setVisibility(View.GONE); - mAccountHeaderTypeTextView.setText(R.string.local_profile_title); } else { - CharSequence accountType = type.getDisplayLabel(getContext()); - mAccountHeaderTypeTextView.setText(getContext().getString( - R.string.external_profile_title, - accountType)); - mAccountHeaderNameTextView.setText(accountName); - } - } else { - String accountName = state.getAccountName(); - CharSequence accountType = type.getDisplayLabel(getContext()); - if (TextUtils.isEmpty(accountType)) { - accountType = getContext().getString(R.string.account_phone); - } - if (!TextUtils.isEmpty(accountName)) { mAccountHeaderNameTextView.setVisibility(View.VISIBLE); - mAccountHeaderNameTextView.setText( - getContext().getString(R.string.from_account_format, accountName)); - } else { - // Hide this view so the other text view will be centered vertically - mAccountHeaderNameTextView.setVisibility(View.GONE); + mAccountHeaderNameTextView.setText(accountInfo.first); } - mAccountHeaderTypeTextView.setText( - getContext().getString(R.string.account_type_format, accountType)); + mAccountHeaderTypeTextView.setText(accountInfo.second); } updateAccountHeaderContentDescription(); |