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