12ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian/*
22ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * Copyright (C) 2017 The Android Open Source Project
32ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian *
42ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
52ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * you may not use this file except in compliance with the License.
62ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * You may obtain a copy of the License at
72ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian *
82ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
92ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian *
102ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * Unless required by applicable law or agreed to in writing, software
112ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
122ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * See the License for the specific language governing permissions and
142ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian * limitations under the License
152ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian */
162ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
172ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianpackage com.android.dialer.searchfragment.nearbyplaces;
182ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
192ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.content.Context;
202ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.net.Uri;
212ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.provider.ContactsContract;
22dede7e703541f81af4533ce4a53f18f327090568calderwoodraimport android.provider.ContactsContract.Contacts;
232ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.support.v7.widget.RecyclerView;
242ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.view.View;
252ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.widget.QuickContactBadge;
262ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport android.widget.TextView;
27dede7e703541f81af4533ce4a53f18f327090568calderwoodraimport com.android.contacts.common.util.Constants;
282ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.callintent.CallInitiationType;
292ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.callintent.CallIntentBuilder;
302ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.contactphoto.ContactPhotoManager;
312ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.lettertile.LetterTileDrawable;
320efc840171da8739359b326249978d0a44df540btwyenimport com.android.dialer.precall.PreCall;
332ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.searchfragment.common.Projections;
342ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.searchfragment.common.QueryBoldingUtil;
352ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianimport com.android.dialer.searchfragment.common.R;
36dede7e703541f81af4533ce4a53f18f327090568calderwoodraimport com.android.dialer.searchfragment.common.SearchCursor;
372ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
382ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian/** ViewHolder for a nearby place row. */
392ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanianpublic final class NearbyPlaceViewHolder extends RecyclerView.ViewHolder
402ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    implements View.OnClickListener {
412ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
422ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  private final Context context;
432ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  private final TextView placeName;
442ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  private final TextView placeAddress;
452ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  private final QuickContactBadge photo;
462ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
472ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  private String number;
482ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
492ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  public NearbyPlaceViewHolder(View view) {
502ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    super(view);
512ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    view.setOnClickListener(this);
522ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    photo = view.findViewById(R.id.photo);
532ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    placeName = view.findViewById(R.id.primary);
542ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    placeAddress = view.findViewById(R.id.secondary);
552ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    context = view.getContext();
562ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  }
572ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
582ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  /**
592ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian   * Binds the ViewHolder with a cursor from {@link NearbyPlacesCursorLoader} with the data found at
602ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian   * the cursors set position.
612ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian   */
62dede7e703541f81af4533ce4a53f18f327090568calderwoodra  public void bind(SearchCursor cursor, String query) {
632ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    number = cursor.getString(Projections.PHONE_NUMBER);
64fe7e9e1d5a083bfe376df0d54bcf632f60012dcfcalderwoodra    String name = cursor.getString(Projections.DISPLAY_NAME);
652ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    String address = cursor.getString(Projections.PHONE_LABEL);
662ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
6782670fee34bfc922905f31d3904406eb0677b162linyuh    placeName.setText(QueryBoldingUtil.getNameWithQueryBolded(query, name, context));
6882670fee34bfc922905f31d3904406eb0677b162linyuh    placeAddress.setText(QueryBoldingUtil.getNameWithQueryBolded(query, address, context));
69fe7e9e1d5a083bfe376df0d54bcf632f60012dcfcalderwoodra    String photoUri = cursor.getString(Projections.PHOTO_URI);
702ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian    ContactPhotoManager.getInstance(context)
712ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian        .loadDialerThumbnailOrPhoto(
722ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian            photo,
732ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian            getContactUri(cursor),
74fe7e9e1d5a083bfe376df0d54bcf632f60012dcfcalderwoodra            cursor.getLong(Projections.PHOTO_ID),
752ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian            photoUri == null ? null : Uri.parse(photoUri),
762ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian            name,
77dede7e703541f81af4533ce4a53f18f327090568calderwoodra            LetterTileDrawable.TYPE_BUSINESS);
782ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  }
792ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
80dede7e703541f81af4533ce4a53f18f327090568calderwoodra  private static Uri getContactUri(SearchCursor cursor) {
81dede7e703541f81af4533ce4a53f18f327090568calderwoodra    // Since the lookup key for Nearby Places is actually a JSON representation of the information,
82dede7e703541f81af4533ce4a53f18f327090568calderwoodra    // we need to pass it in as an encoded fragment in our contact uri.
83dede7e703541f81af4533ce4a53f18f327090568calderwoodra    // It includes information like display name, photo uri, phone number, ect.
84fe7e9e1d5a083bfe376df0d54bcf632f60012dcfcalderwoodra    String businessInfoJson = cursor.getString(Projections.LOOKUP_KEY);
85dede7e703541f81af4533ce4a53f18f327090568calderwoodra    return Contacts.CONTENT_LOOKUP_URI
86dede7e703541f81af4533ce4a53f18f327090568calderwoodra        .buildUpon()
87dede7e703541f81af4533ce4a53f18f327090568calderwoodra        .appendPath(Constants.LOOKUP_URI_ENCODED)
88dede7e703541f81af4533ce4a53f18f327090568calderwoodra        .appendQueryParameter(
89dede7e703541f81af4533ce4a53f18f327090568calderwoodra            ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(cursor.getDirectoryId()))
90dede7e703541f81af4533ce4a53f18f327090568calderwoodra        .encodedFragment(businessInfoJson)
91dede7e703541f81af4533ce4a53f18f327090568calderwoodra        .build();
922ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  }
932ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian
942ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  @Override
952ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  public void onClick(View v) {
960efc840171da8739359b326249978d0a44df540btwyen    PreCall.start(context, new CallIntentBuilder(number, CallInitiationType.Type.REGULAR_SEARCH));
972ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian  }
982ca4318cc1ee57dda907ba2069bd61d162b1baefEric Erfanian}
99