Merge changes I43cc987c,I99ef5ccf,Icae34dd6,I161b5127,I4740c0f4, ...

* changes:
  Update title of after call spam dialog.
  Used VectorDrawable for Blocked Numbers
  Finish AudioRouteSelectorActivity when all calls disconnect.
  Add LookupUri to PeopApiPhoneLookupInfo
  Implemented NUI menu items.
  Implemented GoogleMainSearchController to customize menu to GoogleDialer.
  Show reject hint text for all incoming calls
diff --git a/java/com/android/dialer/glidephotomanager/impl/GlidePhotoManagerImpl.java b/java/com/android/dialer/glidephotomanager/impl/GlidePhotoManagerImpl.java
index 20d379c..c6d9205 100644
--- a/java/com/android/dialer/glidephotomanager/impl/GlidePhotoManagerImpl.java
+++ b/java/com/android/dialer/glidephotomanager/impl/GlidePhotoManagerImpl.java
@@ -65,6 +65,9 @@
   }
 
   private GlideRequest<Drawable> buildRequest(GlideRequests requestManager, PhotoInfo photoInfo) {
+    // Warning: Glide ignores extra attributes on BitmapDrawable such as tint and draw the bitmap
+    // directly so be sure not to set tint in the XML of any drawable referenced below.
+
     // The spam status takes precedence over whether the number is blocked.
     if (photoInfo.isSpam()) {
       return requestManager.load(R.drawable.ic_report_red_48dp);
diff --git a/java/com/android/dialer/glidephotomanager/impl/res/drawable-xxxhdpi/ic_block_black_48dp.png b/java/com/android/dialer/glidephotomanager/impl/res/drawable-xxxhdpi/ic_block_black_48dp.png
deleted file mode 100644
index 1168bd8..0000000
--- a/java/com/android/dialer/glidephotomanager/impl/res/drawable-xxxhdpi/ic_block_black_48dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/glidephotomanager/impl/res/drawable/ic_block_grey_48dp.xml b/java/com/android/dialer/glidephotomanager/impl/res/drawable/ic_block_grey_48dp.xml
index 42cfa99..9d2fb36 100644
--- a/java/com/android/dialer/glidephotomanager/impl/res/drawable/ic_block_grey_48dp.xml
+++ b/java/com/android/dialer/glidephotomanager/impl/res/drawable/ic_block_grey_48dp.xml
@@ -12,6 +12,13 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/ic_block_black_48dp"
-    android:tint="#757575" />
\ No newline at end of file
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path android:pathData="M0 0h24v24H0z"/>
+  <path
+      android:fillColor="#757575"
+      android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"/>
+</vector>
\ No newline at end of file
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 0296ec9..f1486ba 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -25,10 +25,13 @@
 import android.support.design.widget.FloatingActionButton;
 import android.support.v7.app.AppCompatActivity;
 import android.text.TextUtils;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.animation.Animation;
 import android.view.animation.Animation.AnimationListener;
 import android.widget.Toast;
+import com.android.contacts.common.dialog.ClearFrequentsDialog;
+import com.android.dialer.app.settings.DialerSettingsActivity;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
@@ -36,6 +39,8 @@
 import com.android.dialer.dialpadview.DialpadFragment;
 import com.android.dialer.dialpadview.DialpadFragment.DialpadListener;
 import com.android.dialer.dialpadview.DialpadFragment.OnDialpadQueryChangedListener;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
 import com.android.dialer.main.impl.bottomnav.BottomNavBar;
 import com.android.dialer.main.impl.toolbar.MainToolbar;
 import com.android.dialer.main.impl.toolbar.SearchBarListener;
@@ -58,7 +63,7 @@
  *
  * @see #onBackPressed()
  */
-final class MainSearchController implements SearchBarListener {
+public class MainSearchController implements SearchBarListener {
 
   private static final String KEY_IS_FAB_HIDDEN = "is_fab_hidden";
   private static final String KEY_CURRENT_TAB = "current_tab";
@@ -74,7 +79,7 @@
   private final FloatingActionButton fab;
   private final MainToolbar toolbar;
 
-  MainSearchController(
+  public MainSearchController(
       MainActivity mainActivity,
       BottomNavBar bottomNav,
       FloatingActionButton fab,
@@ -324,6 +329,20 @@
     }
   }
 
+  @Override
+  public boolean onMenuItemClicked(MenuItem menuItem) {
+    if (menuItem.getItemId() == R.id.settings) {
+      mainActivity.startActivity(new Intent(mainActivity, DialerSettingsActivity.class));
+      Logger.get(mainActivity).logScreenView(ScreenEvent.Type.SETTINGS, mainActivity);
+      return true;
+    } else if (menuItem.getItemId() == R.id.clear_frequents) {
+      ClearFrequentsDialog.show(mainActivity.getFragmentManager());
+      Logger.get(mainActivity).logScreenView(ScreenEvent.Type.CLEAR_FREQUENTS, mainActivity);
+      return true;
+    }
+    return false;
+  }
+
   public void onVoiceResults(int resultCode, Intent data) {
     if (resultCode == AppCompatActivity.RESULT_OK) {
       ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
@@ -338,12 +357,6 @@
     }
   }
 
-  @Override
-  public void openSettings() {}
-
-  @Override
-  public void sendFeedback() {}
-
   public void onSaveInstanceState(Bundle bundle) {
     bundle.putBoolean(KEY_IS_FAB_HIDDEN, !fab.isShown());
     bundle.putInt(KEY_CURRENT_TAB, bottomNav.getSelectedTab());
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index a27bdd2..c46e61b 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -188,7 +188,7 @@
             mainActivity, mainActivity.getContentResolver(), bottomNav, toolbar);
     bottomNav.addOnTabSelectedListener(callLogFragmentListener);
 
-    searchController = new MainSearchController(mainActivity, bottomNav, fab, toolbar);
+    searchController = getNewMainSearchController(bottomNav, fab, toolbar);
     toolbar.setSearchBarListener(searchController);
 
     onDialpadQueryChangedListener = new MainOnDialpadQueryChangedListener(searchController);
@@ -355,6 +355,11 @@
     }
   }
 
+  public MainSearchController getNewMainSearchController(
+      BottomNavBar bottomNavBar, FloatingActionButton fab, MainToolbar mainToolbar) {
+    return new MainSearchController(mainActivity, bottomNavBar, fab, mainToolbar);
+  }
+
   /** @see OnContactSelectedListener */
   private static final class MainOnContactSelectedListener implements OnContactSelectedListener {
 
diff --git a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
index 1d7f7ce..6044229 100644
--- a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
+++ b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
@@ -36,6 +36,7 @@
 
   private SearchBarView searchBar;
   private SearchBarListener listener;
+  private MainToolbarMenu overflowMenu;
   private boolean isSlideUp;
 
   public MainToolbar(Context context, AttributeSet attrs) {
@@ -46,7 +47,7 @@
   protected void onFinishInflate() {
     super.onFinishInflate();
     ImageButton optionsMenuButton = findViewById(R.id.main_options_menu_button);
-    MainToolbarMenu overflowMenu = new MainToolbarMenu(getContext(), optionsMenuButton);
+    overflowMenu = new MainToolbarMenu(getContext(), optionsMenuButton);
     overflowMenu.inflate(R.menu.main_menu);
     overflowMenu.setOnMenuItemClickListener(this);
     optionsMenuButton.setOnClickListener(v -> overflowMenu.show());
@@ -57,12 +58,7 @@
 
   @Override
   public boolean onMenuItemClick(MenuItem menuItem) {
-    if (menuItem.getItemId() == R.id.settings) {
-      listener.openSettings();
-    } else if (menuItem.getItemId() == R.id.feedback) {
-      listener.sendFeedback();
-    }
-    return false;
+    return listener.onMenuItemClicked(menuItem);
   }
 
   public void setSearchBarListener(SearchBarListener listener) {
@@ -129,4 +125,8 @@
   public void showKeyboard() {
     searchBar.showKeyboard();
   }
+
+  public MainToolbarMenu getOverflowMenu() {
+    return overflowMenu;
+  }
 }
diff --git a/java/com/android/dialer/main/impl/toolbar/MainToolbarMenu.java b/java/com/android/dialer/main/impl/toolbar/MainToolbarMenu.java
index f4dfeef..3c6e361 100644
--- a/java/com/android/dialer/main/impl/toolbar/MainToolbarMenu.java
+++ b/java/com/android/dialer/main/impl/toolbar/MainToolbarMenu.java
@@ -22,18 +22,15 @@
 import android.view.View;
 
 /** Popup menu accessible from the search bar */
-final class MainToolbarMenu extends PopupMenu {
+public final class MainToolbarMenu extends PopupMenu {
 
   public MainToolbarMenu(Context context, View anchor) {
-    super(context, anchor, Gravity.TOP);
-    // TODO(calderwoodra): menu should open from the top, not the bottom
+    super(context, anchor, Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);
   }
 
   @Override
   public void show() {
     super.show();
-    // TODO(calderwoodra): show/hide clear frequents
-    // TODO(calderwoodra): only show call history item if we have phone permission
     // TODO(calderwoodra): show simulator buttons
   }
 }
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
index 2e31997..a074b51 100644
--- a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
+++ b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
@@ -16,6 +16,8 @@
 
 package com.android.dialer.main.impl.toolbar;
 
+import android.view.MenuItem;
+
 /** Useful callback for {@link SearchBarView} listeners. */
 public interface SearchBarListener {
 
@@ -31,11 +33,8 @@
   /** Called when the voice search button is clicked. */
   void onVoiceButtonClicked(VoiceSearchResultCallback voiceSearchResultCallback);
 
-  /** Called when the settings option is selected from the search menu. */
-  void openSettings();
-
-  /** Called when send feedback is selected from the search menu. */
-  void sendFeedback();
+  /** Called when a toolbar menu item is clicked. */
+  boolean onMenuItemClicked(MenuItem menuItem);
 
   /** Interface for returning voice results to the search bar. */
   interface VoiceSearchResultCallback {
diff --git a/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml b/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml
index 5b09fca..01309dd 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/menu/main_menu.xml
@@ -22,7 +22,7 @@
       app:showAsAction="collapseActionView"/>
 
   <item
-      android:id="@+id/feedback"
-      android:title="@string/main_send_feedback"
+      android:id="@+id/clear_frequents"
+      android:title="@string/main_menu_clear_frequents"
       app:showAsAction="collapseActionView"/>
 </menu>
\ No newline at end of file
diff --git a/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml b/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml
index 6af235b..66ccfb4 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/values/strings.xml
@@ -37,8 +37,8 @@
 
   <!-- Show users their settings [CHAR LIMIT=20] -->
   <string name="settings">Settings</string>
-  <!-- Send feedback about the app [CHAR LIMIT=20] -->
-  <string name="main_send_feedback">Send feedback</string>
+  <!--  The menu item to clear frequents [CHAR LIMIT=30] -->
+  <string name="main_menu_clear_frequents">Clear frequents</string>
 
   <!-- Remove button that shows up when contact is long-pressed. [CHAR LIMIT=NONE] -->
   <string name="main_remove_contact">Remove</string>
diff --git a/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java b/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java
index 874bdbc..ce4030d 100644
--- a/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java
+++ b/java/com/android/dialer/phonelookup/consolidator/PhoneLookupInfoConsolidator.java
@@ -159,6 +159,7 @@
       case NameSource.CP2_REMOTE:
         return Assert.isNotNull(firstCp2RemoteContact).getLookupUri();
       case NameSource.PEOPLE_API:
+        return Assert.isNotNull(phoneLookupInfo.getPeopleApiInfo().getLookupUri());
       case NameSource.NONE:
         return "";
       default:
diff --git a/java/com/android/dialer/phonelookup/phone_lookup_info.proto b/java/com/android/dialer/phonelookup/phone_lookup_info.proto
index 57a61ac..e9cb9f8 100644
--- a/java/com/android/dialer/phonelookup/phone_lookup_info.proto
+++ b/java/com/android/dialer/phonelookup/phone_lookup_info.proto
@@ -117,6 +117,11 @@
     // The type of the lookup result, for example, a saved contact or a nearby
     // business.
     optional InfoType info_type = 6;
+
+    // A URI that contains encoded JSON about the number so contacts can
+    // populate the quick contact activity with name and numbers. This does not
+    // point to any real contact entry anywhere.
+    optional string lookup_uri = 7;
   }
   optional PeopleApiInfo people_api_info = 3;
 
diff --git a/java/com/android/incallui/AudioRouteSelectorActivity.java b/java/com/android/incallui/AudioRouteSelectorActivity.java
index a6fcc9c..7728cd5 100644
--- a/java/com/android/incallui/AudioRouteSelectorActivity.java
+++ b/java/com/android/incallui/AudioRouteSelectorActivity.java
@@ -17,6 +17,7 @@
 package com.android.incallui;
 
 import android.os.Bundle;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.FragmentActivity;
 import android.telecom.CallAudioState;
@@ -26,24 +27,21 @@
 import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment;
 import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment.AudioRouteSelectorPresenter;
 import com.android.incallui.call.CallList;
+import com.android.incallui.call.CallList.Listener;
 import com.android.incallui.call.DialerCall;
 import com.android.incallui.call.TelecomAdapter;
 
 /** Simple activity that just shows the audio route selector fragment */
 public class AudioRouteSelectorActivity extends FragmentActivity
-    implements AudioRouteSelectorPresenter {
-
-  public static final String SHOULD_LOG_BUBBLE_V2_IMPRESSION_EXTRA = "shouldLogBubbleV2Impression";
-
-  private boolean shouldLogBubbleV2Impression;
+    implements AudioRouteSelectorPresenter, Listener {
 
   @Override
   protected void onCreate(@Nullable Bundle bundle) {
     super.onCreate(bundle);
-    shouldLogBubbleV2Impression =
-        getIntent().getBooleanExtra(SHOULD_LOG_BUBBLE_V2_IMPRESSION_EXTRA, false);
     AudioRouteSelectorDialogFragment.newInstance(AudioModeProvider.getInstance().getAudioState())
         .show(getSupportFragmentManager(), AudioRouteSelectorDialogFragment.TAG);
+
+    CallList.getInstance().addListener(this);
   }
 
   @Override
@@ -51,10 +49,6 @@
     TelecomAdapter.getInstance().setAudioRoute(audioRoute);
     finish();
 
-    if (!shouldLogBubbleV2Impression) {
-      return;
-    }
-
     // Log the select action with audio route and call
     DialerImpression.Type impressionType = null;
     if ((audioRoute & CallAudioState.ROUTE_WIRED_OR_EARPIECE) != 0) {
@@ -68,10 +62,7 @@
       return;
     }
 
-    DialerCall call = CallList.getInstance().getOutgoingCall();
-    if (call == null) {
-      call = CallList.getInstance().getActiveOrBackgroundCall();
-    }
+    DialerCall call = getCall();
     if (call != null) {
       Logger.get(this)
           .logCallImpression(impressionType, call.getUniqueCallId(), call.getTimeAddedMs());
@@ -102,4 +93,46 @@
       finish();
     }
   }
+
+  @Override
+  protected void onDestroy() {
+    CallList.getInstance().removeListener(this);
+    super.onDestroy();
+  }
+
+  private DialerCall getCall() {
+    DialerCall dialerCall = CallList.getInstance().getOutgoingCall();
+    if (dialerCall == null) {
+      dialerCall = CallList.getInstance().getActiveOrBackgroundCall();
+    }
+    return dialerCall;
+  }
+
+  @Override
+  public void onDisconnect(DialerCall call) {
+    if (getCall() == null) {
+      finish();
+    }
+  }
+
+  @Override
+  public void onIncomingCall(DialerCall call) {}
+
+  @Override
+  public void onUpgradeToVideo(DialerCall call) {}
+
+  @Override
+  public void onSessionModificationStateChange(DialerCall call) {}
+
+  @Override
+  public void onCallListChange(CallList callList) {}
+
+  @Override
+  public void onWiFiToLteHandover(DialerCall call) {}
+
+  @Override
+  public void onHandoverToWifiFailed(DialerCall call) {}
+
+  @Override
+  public void onInternationalCallOnWifi(@NonNull DialerCall call) {}
 }
diff --git a/java/com/android/incallui/NewReturnToCallActionReceiver.java b/java/com/android/incallui/NewReturnToCallActionReceiver.java
index 23debe2..527a79b 100644
--- a/java/com/android/incallui/NewReturnToCallActionReceiver.java
+++ b/java/com/android/incallui/NewReturnToCallActionReceiver.java
@@ -110,7 +110,6 @@
   public void showAudioRouteSelector(Context context) {
     Intent intent = new Intent(context, AudioRouteSelectorActivity.class);
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
-    intent.putExtra(AudioRouteSelectorActivity.SHOULD_LOG_BUBBLE_V2_IMPRESSION_EXTRA, true);
     context.startActivity(intent);
   }
 
diff --git a/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java b/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
index ebbaef8..fe6bbbc 100644
--- a/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
+++ b/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
@@ -370,11 +370,10 @@
   public void setHintText(@Nullable CharSequence hintText) {
     if (hintText == null) {
       swipeToAnswerText.setText(R.string.call_incoming_swipe_to_answer);
-      swipeToRejectText.setText(R.string.call_incoming_swipe_to_reject);
     } else {
       swipeToAnswerText.setText(hintText);
-      swipeToRejectText.setText(null);
     }
+    swipeToRejectText.setText(R.string.call_incoming_swipe_to_reject);
   }
 
   @Override
diff --git a/java/com/android/incallui/spam/res/values/strings.xml b/java/com/android/incallui/spam/res/values/strings.xml
index 3248c69..e893f2a 100644
--- a/java/com/android/incallui/spam/res/values/strings.xml
+++ b/java/com/android/incallui/spam/res/values/strings.xml
@@ -20,7 +20,7 @@
   <!-- Title for the notification to the user after a call from an unknown number ends. [CHAR LIMIT=100] -->
   <string name="non_spam_notification_title">Know <xliff:g id="number">%1$s</xliff:g>?</string>
   <!-- Title for the notification to the user after a call from an spammer ends. [CHAR LIMIT=100] -->
-  <string name="spam_notification_title">Was <xliff:g id="number">%1$s</xliff:g> a spam call?</string>
+  <string name="spam_notification_title">Was <xliff:g id="number">%1$s</xliff:g> a spam caller?</string>
   <!-- Text for the toast shown after the user presses block/report spam. [CHAR LIMIT=100] -->
   <string name="spam_notification_block_report_toast_text"><xliff:g id="number">%1$s</xliff:g> blocked and call was reported as spam.</string>
   <!-- Text for the toast shown after the user presses not spam. [CHAR LIMIT=100] -->