1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.datamodel.data; 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context; 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Intent; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.Uri; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.Binding; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.BindingBase; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.BindableMediaRequest; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.MediaRequest; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.MediaResourceManager; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.MediaResourceManager.MediaResourceLoadListener; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.VCardRequestDescriptor; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.VCardResource; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.media.VCardResourceEntry; 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert; 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.AvatarUriUtil; 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ContactUtil; 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.List; 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/** 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Data class for visualizing and loading data for a VCard contact. 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class VCardContactItemData extends PersonItemData 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd implements MediaResourceLoadListener<VCardResource> { 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final Context mContext; 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final Uri mVCardUri; 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private String mDetails; 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final Binding<BindableMediaRequest<VCardResource>> mBinding = 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd BindingBase.createBinding(this); 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private VCardResource mVCardResource; 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final Uri sDefaultAvatarUri = 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd AvatarUriUtil.createAvatarUri(null, null, null, null); 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Constructor. This parses data from the given MessagePartData describing the vcard 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public VCardContactItemData(final Context context, final MessagePartData messagePartData) { 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd this(context, messagePartData.getContentUri()); 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(messagePartData.isVCard()); 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Constructor. This parses data from the given VCard Uri 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public VCardContactItemData(final Context context, final Uri vCardUri) { 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mContext = context; 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDetails = mContext.getString(R.string.loading_vcard); 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mVCardUri = vCardUri; 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public Uri getAvatarUri() { 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (hasValidVCard()) { 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final List<VCardResourceEntry> vcards = mVCardResource.getVCards(); 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(vcards.size() > 0); 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (vcards.size() == 1) { 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return vcards.get(0).getAvatarUri(); 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return sDefaultAvatarUri; 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public String getDisplayName() { 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (hasValidVCard()) { 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final List<VCardResourceEntry> vcards = mVCardResource.getVCards(); 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(vcards.size() > 0); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (vcards.size() == 1) { 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return vcards.get(0).getDisplayName(); 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mContext.getResources().getQuantityString( 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd R.plurals.vcard_multiple_display_name, vcards.size(), vcards.size()); 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public String getDetails() { 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mDetails; 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public Intent getClickIntent() { 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public long getContactId() { 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return ContactUtil.INVALID_CONTACT_ID; 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public String getLookupKey() { 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public String getNormalizedDestination() { 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public VCardResource getVCardResource() { 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return hasValidVCard() ? mVCardResource : null; 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public Uri getVCardUri() { 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return hasValidVCard() ? mVCardUri : null; 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean hasValidVCard() { 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return isBound() && mVCardResource != null; 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void bind(final String bindingId) { 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.bind(bindingId); 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Bind and request the VCard from media resource manager. 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.bind(new VCardRequestDescriptor(mVCardUri).buildAsyncMediaRequest(mContext, this)); 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd MediaResourceManager.get().requestMediaResourceAsync(mBinding.getData()); 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void unbind(final String bindingId) { 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.unbind(bindingId); 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.unbind(); 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mVCardResource != null) { 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mVCardResource.release(); 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mVCardResource = null; 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean equals(final Object o) { 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (this == o) { 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!(o instanceof VCardContactItemData)) { 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final VCardContactItemData lhs = (VCardContactItemData) o; 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mVCardUri.equals(lhs.mVCardUri); 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onMediaResourceLoaded(final MediaRequest<VCardResource> request, 169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final VCardResource resource, final boolean isCached) { 170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(mVCardResource == null); 171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.ensureBound(); 172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDetails = mContext.getString(R.string.vcard_tap_hint); 173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mVCardResource = resource; 174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mVCardResource.addRef(); 175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd notifyDataUpdated(); 176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onMediaResourceLoadError(final MediaRequest<VCardResource> request, 180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Exception exception) { 181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.ensureBound(); 182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDetails = mContext.getString(R.string.failed_loading_vcard); 183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd notifyDataFailed(exception); 184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 186