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