Loading src/com/android/contacts/model/AccountType.java +56 −5 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.util.Log; import android.view.inputmethod.EditorInfo; import android.widget.EditText; Loading Loading @@ -83,11 +82,35 @@ public abstract class AccountType { */ private HashMap<String, DataKind> mMimeKinds = Maps.newHashMap(); protected boolean mIsInitialized; protected static class DefinitionException extends Exception { public DefinitionException(String message) { super(message); } public DefinitionException(String message, Exception inner) { super(message, inner); } } /** * Whether this account type was able to be fully initialized. This may be false if * (for example) the package name associated with the account type could not be found. */ public boolean isInitialized() { public final boolean isInitialized() { return mIsInitialized; } /** * @return Whether this type is an "embedded" type. i.e. any of {@link FallbackAccountType}, * {@link GoogleAccountType} or {@link ExternalAccountType}. * * If an embedded type cannot be initialized (i.e. if {@link #isInitialized()} returns * {@code false}) it's considered critical, and the application will crash. On the other * hand if it's not an embedded type, we just skip loading the type. */ public boolean isEmbedded() { return true; } Loading Loading @@ -274,10 +297,10 @@ public abstract class AccountType { /** * Add given {@link DataKind} to list of those provided by this source. */ public DataKind addKind(DataKind kind) { public DataKind addKind(DataKind kind) throws DefinitionException { if (mMimeKinds.get(kind.mimeType) != null) { // TODO Make it exception. Log.w(TAG, "mime type '" + kind.mimeType + "' is already registered"); throw new DefinitionException( "mime type '" + kind.mimeType + "' is already registered"); } kind.resPackageName = this.resPackageName; Loading Loading @@ -337,6 +360,16 @@ public abstract class AccountType { public int hashCode() { return rawValue; } @Override public String toString() { return this.getClass().getSimpleName() + " rawValue=" + rawValue + " labelRes=" + labelRes + " secondary=" + secondary + " specificMax=" + specificMax + " customColumn=" + customColumn; } } public static class EventEditType extends EditType { Loading @@ -354,6 +387,11 @@ public abstract class AccountType { mYearOptional = yearOptional; return this; } @Override public String toString() { return super.toString() + " mYearOptional=" + mYearOptional; } } /** Loading Loading @@ -403,6 +441,19 @@ public abstract class AccountType { public boolean isMultiLine() { return (inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0; } @Override public String toString() { return this.getClass().getSimpleName() + ":" + " column=" + column + " titleRes=" + titleRes + " inputType=" + inputType + " minLines=" + minLines + " optional=" + optional + " shortForm=" + shortForm + " longForm=" + longForm; } } /** Loading src/com/android/contacts/model/AccountTypeManager.java +6 −1 Original line number Diff line number Diff line Loading @@ -411,7 +411,12 @@ class AccountTypeManagerImpl extends AccountTypeManager Log.d(TAG, "Registering external account type=" + type + ", packageName=" + auth.packageName); accountType = new ExternalAccountType(mContext, auth.packageName, false); } if (!accountType.isInitialized()) { if (accountType.isEmbedded()) { throw new IllegalStateException("Problem initializing embedded type " + accountType.getClass().getCanonicalName()); } else { // Skip external account types that couldn't be initialized. continue; } Loading src/com/android/contacts/model/BaseAccountType.java +49 −51 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.contacts.model; import com.android.contacts.R; import com.android.contacts.model.AccountType.DefinitionException; import com.android.contacts.util.DateUtils; import com.google.android.collect.Lists; import com.google.android.collect.Maps; Loading Loading @@ -107,16 +108,6 @@ public abstract class BaseAccountType extends AccountType { static final int GROUP_MEMBERSHIP = 999; } protected static class DefinitionException extends Exception { public DefinitionException(String message) { super(message); } public DefinitionException(String message, Exception inner) { super(message, inner); } } public BaseAccountType() { this.accountType = null; this.dataSet = null; Loading Loading @@ -148,11 +139,12 @@ public abstract class BaseAccountType extends AccountType { return new EditType(type, Relation.getTypeLabelResource(type)); } protected DataKind addDataKindStructuredName(Context context) { protected DataKind addDataKindStructuredName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE, R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, Loading @@ -177,11 +169,12 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindDisplayName(Context context) { protected DataKind addDataKindDisplayName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, Loading Loading @@ -217,11 +210,12 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindPhoneticName(Context context) { protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME, R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME, Loading @@ -236,7 +230,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindNickname(Context context) { protected DataKind addDataKindNickname(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Nickname.CONTENT_ITEM_TYPE, R.string.nicknameLabelsGroup, 115, true, R.layout.text_fields_editor_view)); kind.typeOverallMax = 1; Loading @@ -252,7 +246,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindPhone(Context context) { protected DataKind addDataKindPhone(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Phone.CONTENT_ITEM_TYPE, R.string.phoneLabelsGroup, 10, true, R.layout.text_fields_editor_view)); kind.iconAltRes = R.drawable.ic_text_holo_light; Loading @@ -262,8 +256,8 @@ public abstract class BaseAccountType extends AccountType { kind.actionBody = new SimpleInflater(Phone.NUMBER); kind.typeColumn = Phone.TYPE; kind.typeList = Lists.newArrayList(); kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE)); kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK)); kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)); Loading @@ -282,8 +276,7 @@ public abstract class BaseAccountType extends AccountType { kind.typeList.add(buildPhoneType(Phone.TYPE_TTY_TDD).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_MOBILE).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_PAGER).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true).setCustomColumn( Phone.LABEL)); kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true)); kind.fieldList = Lists.newArrayList(); Loading @@ -292,7 +285,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindEmail(Context context) { protected DataKind addDataKindEmail(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Email.CONTENT_ITEM_TYPE, R.string.emailLabelsGroup, 15, true, R.layout.text_fields_editor_view)); kind.actionHeader = new EmailActionInflater(); Loading @@ -312,7 +305,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindStructuredPostal(Context context) { protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredPostal.CONTENT_ITEM_TYPE, R.string.postalLabelsGroup, 25, true, R.layout.text_fields_editor_view)); kind.actionHeader = new PostalActionInflater(); Loading @@ -333,7 +326,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindIm(Context context) { protected DataKind addDataKindIm(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Im.CONTENT_ITEM_TYPE, R.string.imLabelsGroup, 20, true, R.layout.text_fields_editor_view)); kind.actionHeader = new ImActionInflater(); Loading Loading @@ -364,7 +357,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindOrganization(Context context) { protected DataKind addDataKindOrganization(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Organization.CONTENT_ITEM_TYPE, R.string.organizationLabelsGroup, 5, true, R.layout.text_fields_editor_view)); Loading @@ -381,14 +374,15 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindPhoto(Context context) { protected DataKind addDataKindPhoto(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Photo.CONTENT_ITEM_TYPE, -1, -1, true, -1)); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1)); return kind; } protected DataKind addDataKindNote(Context context) { protected DataKind addDataKindNote(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Note.CONTENT_ITEM_TYPE, R.string.label_notes, 110, true, R.layout.text_fields_editor_view)); kind.typeOverallMax = 1; Loading @@ -400,7 +394,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindWebsite(Context context) { protected DataKind addDataKindWebsite(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Website.CONTENT_ITEM_TYPE, R.string.websiteLabelsGroup, 120, true, R.layout.text_fields_editor_view)); kind.actionHeader = new SimpleInflater(R.string.websiteLabelsGroup); Loading @@ -414,7 +408,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindSipAddress(Context context) { protected DataKind addDataKindSipAddress(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(SipAddress.CONTENT_ITEM_TYPE, R.string.label_sip_address, 130, true, R.layout.text_fields_editor_view)); Loading @@ -428,7 +422,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindGroupMembership(Context context) { protected DataKind addDataKindGroupMembership(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(GroupMembership.CONTENT_ITEM_TYPE, R.string.groupsLabel, 999, true, -1)); Loading Loading @@ -496,6 +490,13 @@ public abstract class BaseAccountType extends AccountType { return null; } } @Override public String toString() { return this.getClass().getSimpleName() + " mStringRes=" + mStringRes + " mColumnName" + mColumnName; } } public static abstract class CommonInflater implements StringInflater { Loading Loading @@ -535,6 +536,11 @@ public abstract class BaseAccountType extends AccountType { final String label = values.getAsString(getLabelColumn()); return getTypeLabel(context.getResources(), type, label); } @Override public String toString() { return this.getClass().getSimpleName(); } } public static class PhoneActionInflater extends CommonInflater { Loading Loading @@ -801,15 +807,14 @@ public abstract class BaseAccountType extends AccountType { kind.actionBody = actionBody; kind.fieldList = Lists.newArrayList(); // Get more information from the tag... // A pseudo data kind doesn't have corresponding tag the XML, so we skip this. if (!isPseudo) { kind.typeOverallMax = getAttr(attrs, Attr.MAX_OCCURRENCE, -1); // Handle "types". // If a kind has the type column, contacts.xml must have at least one type definition. // Otherwise, it mustn't have a type definition. // // If it's a pseudo data kind (== data kind that doesn't have the corresponding // DataKind tag in the XML), we just skip this process. if (!isPseudo) { // Process "Type" tags. // If a kind has the type column, contacts.xml must have at least one type // definition. Otherwise, it mustn't have a type definition. if (kind.typeColumn != null) { // Parse and add types. kind.typeList = Lists.newArrayList(); Loading Loading @@ -957,7 +962,6 @@ public abstract class BaseAccountType extends AccountType { throwIfList(ks); kinds.add(ks); // Note about setLongForm/setShortForm below. // We need to set this only when the type supports display name. (=supportsDisplayName) // Otherwise (i.e. Exchange) we don't set these flags, but instead make some fields Loading Loading @@ -988,6 +992,7 @@ public abstract class BaseAccountType extends AccountType { R.string.nameLabelsGroup, Weight.NONE, R.layout.text_fields_editor_view, new SimpleInflater(R.string.nameLabelsGroup), new SimpleInflater(Nickname.NAME)); kd.typeOverallMax = 1; kinds.add(kd); kd.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, Loading Loading @@ -1023,25 +1028,18 @@ public abstract class BaseAccountType extends AccountType { R.string.name_phonetic, Weight.NONE, R.layout.phonetic_name_editor_view, new SimpleInflater(R.string.nameLabelsGroup), new SimpleInflater(Nickname.NAME)); kp.typeOverallMax = 1; kinds.add(kp); // We may want to change the order depending on displayOrderPrimary too. kp.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME, R.string.name_phonetic, FLAGS_PHONETIC).setShortForm(true)); if (!displayOrderPrimary) { kp.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME, R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME, R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME, R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true)); } else { kp.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME, R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME, R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME, R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true)); } return kinds; } } Loading src/com/android/contacts/model/DataKind.java +40 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.contacts.R; import com.android.contacts.model.AccountType.EditField; import com.android.contacts.model.AccountType.EditType; import com.android.contacts.model.AccountType.StringInflater; import com.google.common.collect.Iterators; import android.content.ContentValues; import android.provider.ContactsContract.Data; Loading Loading @@ -95,4 +96,43 @@ public final class DataKind { this.typeOverallMax = -1; this.editorLayoutResourceId = editorLayoutResourceId; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("DataKind:"); sb.append(" resPackageName=").append(resPackageName); sb.append(" mimeType=").append(mimeType); sb.append(" titleRes=").append(titleRes); sb.append(" iconAltRes=").append(iconAltRes); sb.append(" iconAltDescriptionRes=").append(iconAltDescriptionRes); sb.append(" weight=").append(weight); sb.append(" editable=").append(editable); sb.append(" actionHeader=").append(actionHeader); sb.append(" actionAltHeader=").append(actionAltHeader); sb.append(" actionBody=").append(actionBody); sb.append(" actionBodySocial=").append(actionBodySocial); sb.append(" typeColumn=").append(typeColumn); sb.append(" typeOverallMax=").append(typeOverallMax); sb.append(" typeList=").append(toString(typeList)); sb.append(" fieldList=").append(toString(fieldList)); sb.append(" defaultValues=").append(defaultValues); sb.append(" editorLayoutResourceId=").append(editorLayoutResourceId); sb.append(" dateFormatWithoutYear=").append(toString(dateFormatWithoutYear)); sb.append(" dateFormatWithYear=").append(toString(dateFormatWithYear)); return sb.toString(); } public static String toString(SimpleDateFormat format) { return format == null ? "(null)" : format.toPattern(); } public static String toString(Iterable<?> list) { if (list == null) { return "(null)"; } else { return Iterators.toString(list.iterator()); } } } No newline at end of file src/com/android/contacts/model/ExchangeAccountType.java +36 −27 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.contacts.model; import com.android.contacts.R; import com.android.contacts.model.AccountType.DefinitionException; import com.android.contacts.util.DateUtils; import com.google.android.collect.Lists; Loading @@ -33,10 +34,12 @@ import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; import android.util.Log; import java.util.Locale; public class ExchangeAccountType extends BaseAccountType { private static final String TAG = "ExchangeAccountType"; public static final String ACCOUNT_TYPE = "com.android.exchange"; Loading @@ -45,6 +48,7 @@ public class ExchangeAccountType extends BaseAccountType { this.resPackageName = null; this.summaryResPackageName = resPackageName; try { addDataKindStructuredName(context); addDataKindDisplayName(context); addDataKindPhoneticName(context); Loading @@ -59,10 +63,15 @@ public class ExchangeAccountType extends BaseAccountType { addDataKindEvent(context); addDataKindWebsite(context); addDataKindGroupMembership(context); mIsInitialized = true; } catch (DefinitionException e) { Log.e(TAG, "Problem building account type", e); } } @Override protected DataKind addDataKindStructuredName(Context context) { protected DataKind addDataKindStructuredName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE, R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); Loading Loading @@ -91,7 +100,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindDisplayName(Context context) { protected DataKind addDataKindDisplayName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view)); Loading Loading @@ -124,7 +133,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindPhoneticName(Context context) { protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME, R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); Loading @@ -142,7 +151,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindNickname(Context context) { protected DataKind addDataKindNickname(Context context) throws DefinitionException { final DataKind kind = super.addDataKindNickname(context); kind.typeOverallMax = 1; Loading @@ -155,7 +164,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindPhone(Context context) { protected DataKind addDataKindPhone(Context context) throws DefinitionException { final DataKind kind = super.addDataKindPhone(context); kind.typeColumn = Phone.TYPE; Loading Loading @@ -185,7 +194,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindEmail(Context context) { protected DataKind addDataKindEmail(Context context) throws DefinitionException { final DataKind kind = super.addDataKindEmail(context); kind.typeOverallMax = 3; Loading @@ -197,7 +206,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindStructuredPostal(Context context) { protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException { final DataKind kind = super.addDataKindStructuredPostal(context); final boolean useJapaneseOrder = Loading Loading @@ -237,7 +246,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindIm(Context context) { protected DataKind addDataKindIm(Context context) throws DefinitionException { final DataKind kind = super.addDataKindIm(context); // Types are not supported for IM. There can be 3 IMs, but OWA only shows only the first Loading @@ -253,7 +262,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindOrganization(Context context) { protected DataKind addDataKindOrganization(Context context) throws DefinitionException { final DataKind kind = super.addDataKindOrganization(context); kind.typeOverallMax = 1; Loading @@ -268,7 +277,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindPhoto(Context context) { protected DataKind addDataKindPhoto(Context context) throws DefinitionException { final DataKind kind = super.addDataKindPhoto(context); kind.typeOverallMax = 1; Loading @@ -280,7 +289,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindNote(Context context) { protected DataKind addDataKindNote(Context context) throws DefinitionException { final DataKind kind = super.addDataKindNote(context); kind.fieldList = Lists.newArrayList(); Loading @@ -289,7 +298,7 @@ public class ExchangeAccountType extends BaseAccountType { return kind; } protected DataKind addDataKindEvent(Context context) { protected DataKind addDataKindEvent(Context context) throws DefinitionException { DataKind kind = addKind( new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, 150, true, R.layout.event_field_editor_view)); Loading @@ -311,7 +320,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindWebsite(Context context) { protected DataKind addDataKindWebsite(Context context) throws DefinitionException { final DataKind kind = super.addDataKindWebsite(context); kind.typeOverallMax = 1; Loading Loading
src/com/android/contacts/model/AccountType.java +56 −5 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.RawContacts; import android.util.Log; import android.view.inputmethod.EditorInfo; import android.widget.EditText; Loading Loading @@ -83,11 +82,35 @@ public abstract class AccountType { */ private HashMap<String, DataKind> mMimeKinds = Maps.newHashMap(); protected boolean mIsInitialized; protected static class DefinitionException extends Exception { public DefinitionException(String message) { super(message); } public DefinitionException(String message, Exception inner) { super(message, inner); } } /** * Whether this account type was able to be fully initialized. This may be false if * (for example) the package name associated with the account type could not be found. */ public boolean isInitialized() { public final boolean isInitialized() { return mIsInitialized; } /** * @return Whether this type is an "embedded" type. i.e. any of {@link FallbackAccountType}, * {@link GoogleAccountType} or {@link ExternalAccountType}. * * If an embedded type cannot be initialized (i.e. if {@link #isInitialized()} returns * {@code false}) it's considered critical, and the application will crash. On the other * hand if it's not an embedded type, we just skip loading the type. */ public boolean isEmbedded() { return true; } Loading Loading @@ -274,10 +297,10 @@ public abstract class AccountType { /** * Add given {@link DataKind} to list of those provided by this source. */ public DataKind addKind(DataKind kind) { public DataKind addKind(DataKind kind) throws DefinitionException { if (mMimeKinds.get(kind.mimeType) != null) { // TODO Make it exception. Log.w(TAG, "mime type '" + kind.mimeType + "' is already registered"); throw new DefinitionException( "mime type '" + kind.mimeType + "' is already registered"); } kind.resPackageName = this.resPackageName; Loading Loading @@ -337,6 +360,16 @@ public abstract class AccountType { public int hashCode() { return rawValue; } @Override public String toString() { return this.getClass().getSimpleName() + " rawValue=" + rawValue + " labelRes=" + labelRes + " secondary=" + secondary + " specificMax=" + specificMax + " customColumn=" + customColumn; } } public static class EventEditType extends EditType { Loading @@ -354,6 +387,11 @@ public abstract class AccountType { mYearOptional = yearOptional; return this; } @Override public String toString() { return super.toString() + " mYearOptional=" + mYearOptional; } } /** Loading Loading @@ -403,6 +441,19 @@ public abstract class AccountType { public boolean isMultiLine() { return (inputType & EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE) != 0; } @Override public String toString() { return this.getClass().getSimpleName() + ":" + " column=" + column + " titleRes=" + titleRes + " inputType=" + inputType + " minLines=" + minLines + " optional=" + optional + " shortForm=" + shortForm + " longForm=" + longForm; } } /** Loading
src/com/android/contacts/model/AccountTypeManager.java +6 −1 Original line number Diff line number Diff line Loading @@ -411,7 +411,12 @@ class AccountTypeManagerImpl extends AccountTypeManager Log.d(TAG, "Registering external account type=" + type + ", packageName=" + auth.packageName); accountType = new ExternalAccountType(mContext, auth.packageName, false); } if (!accountType.isInitialized()) { if (accountType.isEmbedded()) { throw new IllegalStateException("Problem initializing embedded type " + accountType.getClass().getCanonicalName()); } else { // Skip external account types that couldn't be initialized. continue; } Loading
src/com/android/contacts/model/BaseAccountType.java +49 −51 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.contacts.model; import com.android.contacts.R; import com.android.contacts.model.AccountType.DefinitionException; import com.android.contacts.util.DateUtils; import com.google.android.collect.Lists; import com.google.android.collect.Maps; Loading Loading @@ -107,16 +108,6 @@ public abstract class BaseAccountType extends AccountType { static final int GROUP_MEMBERSHIP = 999; } protected static class DefinitionException extends Exception { public DefinitionException(String message) { super(message); } public DefinitionException(String message, Exception inner) { super(message, inner); } } public BaseAccountType() { this.accountType = null; this.dataSet = null; Loading Loading @@ -148,11 +139,12 @@ public abstract class BaseAccountType extends AccountType { return new EditType(type, Relation.getTypeLabelResource(type)); } protected DataKind addDataKindStructuredName(Context context) { protected DataKind addDataKindStructuredName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE, R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, Loading @@ -177,11 +169,12 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindDisplayName(Context context) { protected DataKind addDataKindDisplayName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, Loading Loading @@ -217,11 +210,12 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindPhoneticName(Context context) { protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME, R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); kind.actionBody = new SimpleInflater(Nickname.NAME); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME, Loading @@ -236,7 +230,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindNickname(Context context) { protected DataKind addDataKindNickname(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Nickname.CONTENT_ITEM_TYPE, R.string.nicknameLabelsGroup, 115, true, R.layout.text_fields_editor_view)); kind.typeOverallMax = 1; Loading @@ -252,7 +246,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindPhone(Context context) { protected DataKind addDataKindPhone(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Phone.CONTENT_ITEM_TYPE, R.string.phoneLabelsGroup, 10, true, R.layout.text_fields_editor_view)); kind.iconAltRes = R.drawable.ic_text_holo_light; Loading @@ -262,8 +256,8 @@ public abstract class BaseAccountType extends AccountType { kind.actionBody = new SimpleInflater(Phone.NUMBER); kind.typeColumn = Phone.TYPE; kind.typeList = Lists.newArrayList(); kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE)); kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK)); kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)); Loading @@ -282,8 +276,7 @@ public abstract class BaseAccountType extends AccountType { kind.typeList.add(buildPhoneType(Phone.TYPE_TTY_TDD).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_MOBILE).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_WORK_PAGER).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true).setCustomColumn( Phone.LABEL)); kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true)); kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true)); kind.fieldList = Lists.newArrayList(); Loading @@ -292,7 +285,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindEmail(Context context) { protected DataKind addDataKindEmail(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Email.CONTENT_ITEM_TYPE, R.string.emailLabelsGroup, 15, true, R.layout.text_fields_editor_view)); kind.actionHeader = new EmailActionInflater(); Loading @@ -312,7 +305,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindStructuredPostal(Context context) { protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredPostal.CONTENT_ITEM_TYPE, R.string.postalLabelsGroup, 25, true, R.layout.text_fields_editor_view)); kind.actionHeader = new PostalActionInflater(); Loading @@ -333,7 +326,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindIm(Context context) { protected DataKind addDataKindIm(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Im.CONTENT_ITEM_TYPE, R.string.imLabelsGroup, 20, true, R.layout.text_fields_editor_view)); kind.actionHeader = new ImActionInflater(); Loading Loading @@ -364,7 +357,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindOrganization(Context context) { protected DataKind addDataKindOrganization(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Organization.CONTENT_ITEM_TYPE, R.string.organizationLabelsGroup, 5, true, R.layout.text_fields_editor_view)); Loading @@ -381,14 +374,15 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindPhoto(Context context) { protected DataKind addDataKindPhoto(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Photo.CONTENT_ITEM_TYPE, -1, -1, true, -1)); kind.typeOverallMax = 1; kind.fieldList = Lists.newArrayList(); kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1)); return kind; } protected DataKind addDataKindNote(Context context) { protected DataKind addDataKindNote(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Note.CONTENT_ITEM_TYPE, R.string.label_notes, 110, true, R.layout.text_fields_editor_view)); kind.typeOverallMax = 1; Loading @@ -400,7 +394,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindWebsite(Context context) { protected DataKind addDataKindWebsite(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(Website.CONTENT_ITEM_TYPE, R.string.websiteLabelsGroup, 120, true, R.layout.text_fields_editor_view)); kind.actionHeader = new SimpleInflater(R.string.websiteLabelsGroup); Loading @@ -414,7 +408,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindSipAddress(Context context) { protected DataKind addDataKindSipAddress(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(SipAddress.CONTENT_ITEM_TYPE, R.string.label_sip_address, 130, true, R.layout.text_fields_editor_view)); Loading @@ -428,7 +422,7 @@ public abstract class BaseAccountType extends AccountType { return kind; } protected DataKind addDataKindGroupMembership(Context context) { protected DataKind addDataKindGroupMembership(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(GroupMembership.CONTENT_ITEM_TYPE, R.string.groupsLabel, 999, true, -1)); Loading Loading @@ -496,6 +490,13 @@ public abstract class BaseAccountType extends AccountType { return null; } } @Override public String toString() { return this.getClass().getSimpleName() + " mStringRes=" + mStringRes + " mColumnName" + mColumnName; } } public static abstract class CommonInflater implements StringInflater { Loading Loading @@ -535,6 +536,11 @@ public abstract class BaseAccountType extends AccountType { final String label = values.getAsString(getLabelColumn()); return getTypeLabel(context.getResources(), type, label); } @Override public String toString() { return this.getClass().getSimpleName(); } } public static class PhoneActionInflater extends CommonInflater { Loading Loading @@ -801,15 +807,14 @@ public abstract class BaseAccountType extends AccountType { kind.actionBody = actionBody; kind.fieldList = Lists.newArrayList(); // Get more information from the tag... // A pseudo data kind doesn't have corresponding tag the XML, so we skip this. if (!isPseudo) { kind.typeOverallMax = getAttr(attrs, Attr.MAX_OCCURRENCE, -1); // Handle "types". // If a kind has the type column, contacts.xml must have at least one type definition. // Otherwise, it mustn't have a type definition. // // If it's a pseudo data kind (== data kind that doesn't have the corresponding // DataKind tag in the XML), we just skip this process. if (!isPseudo) { // Process "Type" tags. // If a kind has the type column, contacts.xml must have at least one type // definition. Otherwise, it mustn't have a type definition. if (kind.typeColumn != null) { // Parse and add types. kind.typeList = Lists.newArrayList(); Loading Loading @@ -957,7 +962,6 @@ public abstract class BaseAccountType extends AccountType { throwIfList(ks); kinds.add(ks); // Note about setLongForm/setShortForm below. // We need to set this only when the type supports display name. (=supportsDisplayName) // Otherwise (i.e. Exchange) we don't set these flags, but instead make some fields Loading Loading @@ -988,6 +992,7 @@ public abstract class BaseAccountType extends AccountType { R.string.nameLabelsGroup, Weight.NONE, R.layout.text_fields_editor_view, new SimpleInflater(R.string.nameLabelsGroup), new SimpleInflater(Nickname.NAME)); kd.typeOverallMax = 1; kinds.add(kd); kd.fieldList.add(new EditField(StructuredName.DISPLAY_NAME, Loading Loading @@ -1023,25 +1028,18 @@ public abstract class BaseAccountType extends AccountType { R.string.name_phonetic, Weight.NONE, R.layout.phonetic_name_editor_view, new SimpleInflater(R.string.nameLabelsGroup), new SimpleInflater(Nickname.NAME)); kp.typeOverallMax = 1; kinds.add(kp); // We may want to change the order depending on displayOrderPrimary too. kp.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME, R.string.name_phonetic, FLAGS_PHONETIC).setShortForm(true)); if (!displayOrderPrimary) { kp.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME, R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME, R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME, R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true)); } else { kp.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME, R.string.name_phonetic_given, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME, R.string.name_phonetic_middle, FLAGS_PHONETIC).setLongForm(true)); kp.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME, R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true)); } return kinds; } } Loading
src/com/android/contacts/model/DataKind.java +40 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.contacts.R; import com.android.contacts.model.AccountType.EditField; import com.android.contacts.model.AccountType.EditType; import com.android.contacts.model.AccountType.StringInflater; import com.google.common.collect.Iterators; import android.content.ContentValues; import android.provider.ContactsContract.Data; Loading Loading @@ -95,4 +96,43 @@ public final class DataKind { this.typeOverallMax = -1; this.editorLayoutResourceId = editorLayoutResourceId; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("DataKind:"); sb.append(" resPackageName=").append(resPackageName); sb.append(" mimeType=").append(mimeType); sb.append(" titleRes=").append(titleRes); sb.append(" iconAltRes=").append(iconAltRes); sb.append(" iconAltDescriptionRes=").append(iconAltDescriptionRes); sb.append(" weight=").append(weight); sb.append(" editable=").append(editable); sb.append(" actionHeader=").append(actionHeader); sb.append(" actionAltHeader=").append(actionAltHeader); sb.append(" actionBody=").append(actionBody); sb.append(" actionBodySocial=").append(actionBodySocial); sb.append(" typeColumn=").append(typeColumn); sb.append(" typeOverallMax=").append(typeOverallMax); sb.append(" typeList=").append(toString(typeList)); sb.append(" fieldList=").append(toString(fieldList)); sb.append(" defaultValues=").append(defaultValues); sb.append(" editorLayoutResourceId=").append(editorLayoutResourceId); sb.append(" dateFormatWithoutYear=").append(toString(dateFormatWithoutYear)); sb.append(" dateFormatWithYear=").append(toString(dateFormatWithYear)); return sb.toString(); } public static String toString(SimpleDateFormat format) { return format == null ? "(null)" : format.toPattern(); } public static String toString(Iterable<?> list) { if (list == null) { return "(null)"; } else { return Iterators.toString(list.iterator()); } } } No newline at end of file
src/com/android/contacts/model/ExchangeAccountType.java +36 −27 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.contacts.model; import com.android.contacts.R; import com.android.contacts.model.AccountType.DefinitionException; import com.android.contacts.util.DateUtils; import com.google.android.collect.Lists; Loading @@ -33,10 +34,12 @@ import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.CommonDataKinds.StructuredPostal; import android.provider.ContactsContract.CommonDataKinds.Website; import android.util.Log; import java.util.Locale; public class ExchangeAccountType extends BaseAccountType { private static final String TAG = "ExchangeAccountType"; public static final String ACCOUNT_TYPE = "com.android.exchange"; Loading @@ -45,6 +48,7 @@ public class ExchangeAccountType extends BaseAccountType { this.resPackageName = null; this.summaryResPackageName = resPackageName; try { addDataKindStructuredName(context); addDataKindDisplayName(context); addDataKindPhoneticName(context); Loading @@ -59,10 +63,15 @@ public class ExchangeAccountType extends BaseAccountType { addDataKindEvent(context); addDataKindWebsite(context); addDataKindGroupMembership(context); mIsInitialized = true; } catch (DefinitionException e) { Log.e(TAG, "Problem building account type", e); } } @Override protected DataKind addDataKindStructuredName(Context context) { protected DataKind addDataKindStructuredName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE, R.string.nameLabelsGroup, -1, true, R.layout.structured_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); Loading Loading @@ -91,7 +100,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindDisplayName(Context context) { protected DataKind addDataKindDisplayName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME, R.string.nameLabelsGroup, -1, true, R.layout.text_fields_editor_view)); Loading Loading @@ -124,7 +133,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindPhoneticName(Context context) { protected DataKind addDataKindPhoneticName(Context context) throws DefinitionException { DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME, R.string.name_phonetic, -1, true, R.layout.phonetic_name_editor_view)); kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup); Loading @@ -142,7 +151,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindNickname(Context context) { protected DataKind addDataKindNickname(Context context) throws DefinitionException { final DataKind kind = super.addDataKindNickname(context); kind.typeOverallMax = 1; Loading @@ -155,7 +164,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindPhone(Context context) { protected DataKind addDataKindPhone(Context context) throws DefinitionException { final DataKind kind = super.addDataKindPhone(context); kind.typeColumn = Phone.TYPE; Loading Loading @@ -185,7 +194,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindEmail(Context context) { protected DataKind addDataKindEmail(Context context) throws DefinitionException { final DataKind kind = super.addDataKindEmail(context); kind.typeOverallMax = 3; Loading @@ -197,7 +206,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindStructuredPostal(Context context) { protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException { final DataKind kind = super.addDataKindStructuredPostal(context); final boolean useJapaneseOrder = Loading Loading @@ -237,7 +246,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindIm(Context context) { protected DataKind addDataKindIm(Context context) throws DefinitionException { final DataKind kind = super.addDataKindIm(context); // Types are not supported for IM. There can be 3 IMs, but OWA only shows only the first Loading @@ -253,7 +262,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindOrganization(Context context) { protected DataKind addDataKindOrganization(Context context) throws DefinitionException { final DataKind kind = super.addDataKindOrganization(context); kind.typeOverallMax = 1; Loading @@ -268,7 +277,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindPhoto(Context context) { protected DataKind addDataKindPhoto(Context context) throws DefinitionException { final DataKind kind = super.addDataKindPhoto(context); kind.typeOverallMax = 1; Loading @@ -280,7 +289,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindNote(Context context) { protected DataKind addDataKindNote(Context context) throws DefinitionException { final DataKind kind = super.addDataKindNote(context); kind.fieldList = Lists.newArrayList(); Loading @@ -289,7 +298,7 @@ public class ExchangeAccountType extends BaseAccountType { return kind; } protected DataKind addDataKindEvent(Context context) { protected DataKind addDataKindEvent(Context context) throws DefinitionException { DataKind kind = addKind( new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, 150, true, R.layout.event_field_editor_view)); Loading @@ -311,7 +320,7 @@ public class ExchangeAccountType extends BaseAccountType { } @Override protected DataKind addDataKindWebsite(Context context) { protected DataKind addDataKindWebsite(Context context) throws DefinitionException { final DataKind kind = super.addDataKindWebsite(context); kind.typeOverallMax = 1; Loading