diff --git a/java/com/android/bubble/res/layout/bubble_base.xml b/java/com/android/bubble/res/layout/bubble_base.xml
index 0712db6..9f88e70 100644
--- a/java/com/android/bubble/res/layout/bubble_base.xml
+++ b/java/com/android/bubble/res/layout/bubble_base.xml
@@ -49,7 +49,7 @@
   <FrameLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
-      android:layout_marginStart="48dp"
+      android:layout_marginStart="@dimen/bubble_drawer_margin"
       android:elevation="10dp"
       android:paddingTop="@dimen/bubble_shadow_padding_size"
       android:paddingBottom="@dimen/bubble_shadow_padding_size"
@@ -59,8 +59,8 @@
         android:id="@+id/bubble_expanded_layout"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:paddingStart="32dp"
-        android:paddingEnd="8dp"
+        android:paddingStart="@dimen/bubble_drawer_padding_start"
+        android:paddingEnd="@dimen/bubble_drawer_padding_end"
         android:background="@drawable/bubble_background_pill_ltr"
         android:layoutDirection="ltr"
         android:orientation="horizontal"
@@ -102,7 +102,7 @@
   <FrameLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
-      android:layout_marginRight="48dp"
+      android:layout_marginRight="@dimen/bubble_drawer_margin"
       android:elevation="10dp"
       android:paddingTop="@dimen/bubble_shadow_padding_size"
       android:paddingBottom="@dimen/bubble_shadow_padding_size"
@@ -111,8 +111,8 @@
         android:id="@+id/bubble_expanded_layout_rtl"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:paddingRight="32dp"
-        android:paddingLeft="8dp"
+        android:paddingRight="@dimen/bubble_drawer_padding_start"
+        android:paddingLeft="@dimen/bubble_drawer_padding_end"
         android:background="@drawable/bubble_background_pill_rtl"
         android:layoutDirection="rtl"
         android:orientation="horizontal"
diff --git a/java/com/android/bubble/res/values-car/values.xml b/java/com/android/bubble/res/values-car/values.xml
new file mode 100644
index 0000000..cf8839a
--- /dev/null
+++ b/java/com/android/bubble/res/values-car/values.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+
+<resources>
+    <dimen name="bubble_size">64dp</dimen>
+    <dimen name="bubble_drawer_margin">54dp</dimen>
+    <dimen name="bubble_drawer_padding_start">38dp</dimen>
+    <dimen name="bubble_drawer_padding_end">10dp</dimen>
+    <dimen name="bubble_icon_padding">18dp</dimen>
+    <dimen name="bubble_shadow_padding_size">18dp</dimen>
+</resources>
+
diff --git a/java/com/android/bubble/res/values/values.xml b/java/com/android/bubble/res/values/values.xml
index f581617..6066e18 100644
--- a/java/com/android/bubble/res/values/values.xml
+++ b/java/com/android/bubble/res/values/values.xml
@@ -15,11 +15,16 @@
   ~ limitations under the License
   -->
 
+
 <resources>
   <dimen name="bubble_safe_margin_x">16dp</dimen>
   <dimen name="bubble_safe_margin_y">64dp</dimen>
   <dimen name="bubble_size">56dp</dimen>
+  <dimen name="bubble_drawer_margin">48dp</dimen>
+  <dimen name="bubble_drawer_padding_start">32dp</dimen>
+  <dimen name="bubble_drawer_padding_end">8dp</dimen>
   <dimen name="bubble_icon_padding">16dp</dimen>
   <dimen name="bubble_move_elevation_change">4dp</dimen>
   <dimen name="bubble_shadow_padding_size">16dp</dimen>
 </resources>
+
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index babf1f8..2baf117 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -740,7 +740,7 @@
     }
 
     boolean isBlockedOrSpam = blockId != null || (isSpamFeatureEnabled && isSpam);
-    
+
     if (!isBlockedOrSpam && info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {
       createNewContactButtonView.setTag(
           IntentProvider.getAddContactIntentProvider(
@@ -1034,8 +1034,8 @@
           && intent.getIntExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, -1)
               == VideoProfile.STATE_BIDIRECTIONAL) {
         Logger.get(mContext).logImpression(DialerImpression.Type.IMS_VIDEO_REQUESTED_FROM_CALL_LOG);
-      }
-      if (intent.getDataString().contains(DuoConstants.PACKAGE_NAME)) {
+      } else if (intent.getDataString() != null
+          && intent.getDataString().contains(DuoConstants.PACKAGE_NAME)) {
         Logger.get(mContext).logImpression(DialerImpression.Type.DUO_CALL_LOG_SET_UP_INSTALL);
       }
 
diff --git a/java/com/android/dialer/logging/dialer_impression.proto b/java/com/android/dialer/logging/dialer_impression.proto
index aed6625..2d2eebf 100644
--- a/java/com/android/dialer/logging/dialer_impression.proto
+++ b/java/com/android/dialer/logging/dialer_impression.proto
@@ -12,7 +12,7 @@
   // Event enums to be used for Impression Logging in Dialer.
   // It's perfectly acceptable for this enum to be large
   // Values should be from 1000 to 100000.
-  // Next Tag: 1311
+  // Next Tag: 1320
   enum Type {
     UNKNOWN_AOSP_EVENT_TYPE = 1000;
 
@@ -625,5 +625,24 @@
     DUO_CALL_LOG_SET_UP_INSTALL = 1308;
     DUO_CALL_LOG_SET_UP_ACTIVATE = 1309;
     DUO_CALL_LOG_INVITE = 1310;
+
+    // Bubble primary button first click to expand bubble
+    BUBBLE_V2_CLICK_TO_EXPAND = 1311;
+    // Bubble primary button second click to collapse bubble
+    BUBBLE_V2_CLICK_TO_COLLAPSE = 1312;
+    // User return to call from bubble call action menu
+    BUBBLE_V2_RETURN_TO_CALL = 1313;
+    // User muted call from bubble call action menu
+    BUBBLE_V2_MUTE_CALL = 1314;
+    // User unmuted call from bubble call action menu
+    BUBBLE_V2_UNMUTE_CALL = 1315;
+    // User choose audio route speakerphone from bubble call action menu
+    BUBBLE_V2_SPEAKERPHONE = 1316;
+    // User choose audio route wired or earpiece from bubble call action menu
+    BUBBLE_V2_WIRED_OR_EARPIECE = 1317;
+    // User choose audio route bluetooth from bubble call action menu
+    BUBBLE_V2_BLUETOOTH = 1318;
+    // User ended call from bubble call action menu
+    BUBBLE_V2_END_CALL = 1319;
   }
 }
diff --git a/java/com/android/incallui/AndroidManifest.xml b/java/com/android/incallui/AndroidManifest.xml
index af99700..b9d481b 100644
--- a/java/com/android/incallui/AndroidManifest.xml
+++ b/java/com/android/incallui/AndroidManifest.xml
@@ -109,6 +109,9 @@
     <receiver
         android:exported="false"
         android:name=".ReturnToCallActionReceiver"/>
+    <receiver
+        android:exported="false"
+        android:name=".NewReturnToCallActionReceiver"/>
 
   </application>
 
diff --git a/java/com/android/incallui/AudioRouteSelectorActivity.java b/java/com/android/incallui/AudioRouteSelectorActivity.java
index 8d16664..a6fcc9c 100644
--- a/java/com/android/incallui/AudioRouteSelectorActivity.java
+++ b/java/com/android/incallui/AudioRouteSelectorActivity.java
@@ -19,18 +19,29 @@
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.v4.app.FragmentActivity;
+import android.telecom.CallAudioState;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
 import com.android.incallui.audiomode.AudioModeProvider;
 import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment;
 import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment.AudioRouteSelectorPresenter;
+import com.android.incallui.call.CallList;
+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;
+
   @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);
   }
@@ -39,6 +50,34 @@
   public void onAudioRouteSelected(int audioRoute) {
     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) {
+      impressionType = DialerImpression.Type.BUBBLE_V2_WIRED_OR_EARPIECE;
+    } else if (audioRoute == CallAudioState.ROUTE_SPEAKER) {
+      impressionType = DialerImpression.Type.BUBBLE_V2_SPEAKERPHONE;
+    } else if (audioRoute == CallAudioState.ROUTE_BLUETOOTH) {
+      impressionType = DialerImpression.Type.BUBBLE_V2_BLUETOOTH;
+    }
+    if (impressionType == null) {
+      return;
+    }
+
+    DialerCall call = CallList.getInstance().getOutgoingCall();
+    if (call == null) {
+      call = CallList.getInstance().getActiveOrBackgroundCall();
+    }
+    if (call != null) {
+      Logger.get(this)
+          .logCallImpression(impressionType, call.getUniqueCallId(), call.getTimeAddedMs());
+    } else {
+      Logger.get(this).logImpression(impressionType);
+    }
   }
 
   @Override
diff --git a/java/com/android/incallui/NewReturnToCallActionReceiver.java b/java/com/android/incallui/NewReturnToCallActionReceiver.java
new file mode 100644
index 0000000..23debe2
--- /dev/null
+++ b/java/com/android/incallui/NewReturnToCallActionReceiver.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.CallAudioState;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.DialerImpression;
+import com.android.dialer.logging.Logger;
+import com.android.incallui.audiomode.AudioModeProvider;
+import com.android.incallui.call.CallList;
+import com.android.incallui.call.DialerCall;
+import com.android.incallui.call.TelecomAdapter;
+
+/** Handles clicks on the return-to-call bubble */
+public class NewReturnToCallActionReceiver extends BroadcastReceiver {
+
+  public static final String ACTION_RETURN_TO_CALL = "returnToCallV2";
+  public static final String ACTION_TOGGLE_SPEAKER = "toggleSpeakerV2";
+  public static final String ACTION_SHOW_AUDIO_ROUTE_SELECTOR = "showAudioRouteSelectorV2";
+  public static final String ACTION_TOGGLE_MUTE = "toggleMuteV2";
+  public static final String ACTION_END_CALL = "endCallV2";
+
+  @Override
+  public void onReceive(Context context, Intent intent) {
+    switch (intent.getAction()) {
+      case ACTION_RETURN_TO_CALL:
+        returnToCall(context);
+        break;
+      case ACTION_TOGGLE_SPEAKER:
+        toggleSpeaker(context);
+        break;
+      case ACTION_SHOW_AUDIO_ROUTE_SELECTOR:
+        showAudioRouteSelector(context);
+        break;
+      case ACTION_TOGGLE_MUTE:
+        toggleMute(context);
+        break;
+      case ACTION_END_CALL:
+        endCall(context);
+        break;
+      default:
+        throw Assert.createIllegalStateFailException(
+            "Invalid intent action: " + intent.getAction());
+    }
+  }
+
+  private void returnToCall(Context context) {
+    DialerCall call = getCall();
+    Logger.get(context)
+        .logCallImpression(
+            DialerImpression.Type.BUBBLE_V2_RETURN_TO_CALL,
+            call != null ? call.getUniqueCallId() : "",
+            call != null ? call.getTimeAddedMs() : 0);
+
+    Intent activityIntent = InCallActivity.getIntent(context, false, false, false);
+    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+    context.startActivity(activityIntent);
+  }
+
+  private void toggleSpeaker(Context context) {
+    CallAudioState audioState = AudioModeProvider.getInstance().getAudioState();
+
+    if ((audioState.getSupportedRouteMask() & CallAudioState.ROUTE_BLUETOOTH)
+        == CallAudioState.ROUTE_BLUETOOTH) {
+      LogUtil.w(
+          "ReturnToCallActionReceiver.toggleSpeaker",
+          "toggleSpeaker() called when bluetooth available."
+              + " Probably should have shown audio route selector");
+    }
+
+    DialerCall call = getCall();
+
+    int newRoute;
+    if (audioState.getRoute() == CallAudioState.ROUTE_SPEAKER) {
+      newRoute = CallAudioState.ROUTE_WIRED_OR_EARPIECE;
+      Logger.get(context)
+          .logCallImpression(
+              DialerImpression.Type.BUBBLE_V2_WIRED_OR_EARPIECE,
+              call != null ? call.getUniqueCallId() : "",
+              call != null ? call.getTimeAddedMs() : 0);
+    } else {
+      newRoute = CallAudioState.ROUTE_SPEAKER;
+      Logger.get(context)
+          .logCallImpression(
+              DialerImpression.Type.BUBBLE_V2_SPEAKERPHONE,
+              call != null ? call.getUniqueCallId() : "",
+              call != null ? call.getTimeAddedMs() : 0);
+    }
+    TelecomAdapter.getInstance().setAudioRoute(newRoute);
+  }
+
+  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);
+  }
+
+  private void toggleMute(Context context) {
+    DialerCall call = getCall();
+    boolean shouldMute = !AudioModeProvider.getInstance().getAudioState().isMuted();
+    Logger.get(context)
+        .logCallImpression(
+            shouldMute
+                ? DialerImpression.Type.BUBBLE_V2_MUTE_CALL
+                : DialerImpression.Type.BUBBLE_V2_UNMUTE_CALL,
+            call != null ? call.getUniqueCallId() : "",
+            call != null ? call.getTimeAddedMs() : 0);
+    TelecomAdapter.getInstance().mute(shouldMute);
+  }
+
+  private void endCall(Context context) {
+    DialerCall call = getCall();
+
+    Logger.get(context)
+        .logCallImpression(
+            DialerImpression.Type.BUBBLE_V2_END_CALL,
+            call != null ? call.getUniqueCallId() : "",
+            call != null ? call.getTimeAddedMs() : 0);
+    if (call != null) {
+      call.disconnect();
+    }
+  }
+
+  private DialerCall getCall() {
+    CallList callList = InCallPresenter.getInstance().getCallList();
+    if (callList != null) {
+      DialerCall call = callList.getOutgoingCall();
+      if (call == null) {
+        call = callList.getActiveOrBackgroundCall();
+      }
+      if (call != null) {
+        return call;
+      }
+    }
+    return null;
+  }
+}
diff --git a/java/com/android/incallui/NewReturnToCallController.java b/java/com/android/incallui/NewReturnToCallController.java
index d3d9930..ad49d68 100644
--- a/java/com/android/incallui/NewReturnToCallController.java
+++ b/java/com/android/incallui/NewReturnToCallController.java
@@ -53,8 +53,6 @@
  */
 public class NewReturnToCallController implements InCallUiListener, Listener, AudioModeListener {
 
-  public static final String RETURN_TO_CALL_EXTRA_KEY = "RETURN_TO_CALL_BUBBLE";
-
   private final Context context;
 
   @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
@@ -78,18 +76,12 @@
     this.context = context;
     this.contactInfoCache = contactInfoCache;
 
-    toggleSpeaker = createActionIntent(ReturnToCallActionReceiver.ACTION_TOGGLE_SPEAKER);
+    toggleSpeaker = createActionIntent(NewReturnToCallActionReceiver.ACTION_TOGGLE_SPEAKER);
     showSpeakerSelect =
-        createActionIntent(ReturnToCallActionReceiver.ACTION_SHOW_AUDIO_ROUTE_SELECTOR);
-    toggleMute = createActionIntent(ReturnToCallActionReceiver.ACTION_TOGGLE_MUTE);
-    endCall = createActionIntent(ReturnToCallActionReceiver.ACTION_END_CALL);
-
-    Intent activityIntent = InCallActivity.getIntent(context, false, false, false);
-    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-    activityIntent.putExtra(RETURN_TO_CALL_EXTRA_KEY, true);
-    fullScreen =
-        PendingIntent.getActivity(
-            context, InCallActivity.PendingIntentRequestCodes.BUBBLE, activityIntent, 0);
+        createActionIntent(NewReturnToCallActionReceiver.ACTION_SHOW_AUDIO_ROUTE_SELECTOR);
+    toggleMute = createActionIntent(NewReturnToCallActionReceiver.ACTION_TOGGLE_MUTE);
+    endCall = createActionIntent(NewReturnToCallActionReceiver.ACTION_END_CALL);
+    fullScreen = createActionIntent(NewReturnToCallActionReceiver.ACTION_RETURN_TO_CALL);
 
     InCallPresenter.getInstance().addInCallUiListener(this);
     CallList.getInstance().addListener(this);
@@ -280,9 +272,9 @@
 
   @NonNull
   private PendingIntent createActionIntent(String action) {
-    Intent toggleSpeaker = new Intent(context, ReturnToCallActionReceiver.class);
-    toggleSpeaker.setAction(action);
-    return PendingIntent.getBroadcast(context, 0, toggleSpeaker, 0);
+    Intent intent = new Intent(context, NewReturnToCallActionReceiver.class);
+    intent.setAction(action);
+    return PendingIntent.getBroadcast(context, 0, intent, 0);
   }
 
   @NonNull
diff --git a/java/com/android/newbubble/NewBubble.java b/java/com/android/newbubble/NewBubble.java
index d13952b..3378ad8 100644
--- a/java/com/android/newbubble/NewBubble.java
+++ b/java/com/android/newbubble/NewBubble.java
@@ -232,10 +232,7 @@
   }
 
   /** Expands the main bubble menu. */
-  public void expand(boolean isUserAction) {
-    if (isUserAction) {
-      logBasicOrCallImpression(DialerImpression.Type.BUBBLE_PRIMARY_BUTTON_EXPAND);
-    }
+  public void expand() {
     setPrimaryButtonAccessibilityAction(
         context.getString(R.string.a11y_bubble_primary_button_collapse_action));
 
@@ -307,8 +304,7 @@
   }
 
   @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  public void startCollapse(
-      @CollapseEnd int endAction, boolean isUserAction, boolean shouldRecoverYPosition) {
+  public void startCollapse(@CollapseEnd int endAction, boolean shouldRecoverYPosition) {
     View expandedView = viewHolder.getExpandedView();
     if (expandedView.getVisibility() != View.VISIBLE || collapseAnimation != null) {
       // Drawer is already collapsed or animation is running.
@@ -321,10 +317,6 @@
     if (collapseEndAction == CollapseEnd.NOTHING) {
       collapseEndAction = endAction;
     }
-    if (isUserAction && collapseEndAction == CollapseEnd.NOTHING) {
-      logBasicOrCallImpression(DialerImpression.Type.BUBBLE_COLLAPSE_BY_USER);
-    }
-
     setPrimaryButtonAccessibilityAction(
         context.getString(R.string.a11y_bubble_primary_button_expand_action));
 
@@ -572,8 +564,7 @@
   public void showText(@NonNull CharSequence text) {
     textShowing = true;
     if (expanded) {
-      startCollapse(
-          CollapseEnd.NOTHING, false /* isUserAction */, false /* shouldRecoverYPosition */);
+      startCollapse(CollapseEnd.NOTHING, false /* shouldRecoverYPosition */);
       doShowText(text);
     } else {
       // Need to transition from old bounds to new bounds manually
@@ -667,10 +658,11 @@
       return;
     }
     if (expanded) {
-      startCollapse(
-          CollapseEnd.NOTHING, true /* isUserAction */, true /* shouldRecoverYPosition */);
+      logBasicOrCallImpression(DialerImpression.Type.BUBBLE_V2_CLICK_TO_COLLAPSE);
+      startCollapse(CollapseEnd.NOTHING, true /* shouldRecoverYPosition */);
     } else {
-      expand(true);
+      logBasicOrCallImpression(DialerImpression.Type.BUBBLE_V2_CLICK_TO_EXPAND);
+      expand();
     }
   }
 
@@ -713,7 +705,7 @@
     }
 
     if (expanded) {
-      startCollapse(CollapseEnd.HIDE, false /* isUserAction */, false /* shouldRecoverYPosition */);
+      startCollapse(CollapseEnd.HIDE, false /* shouldRecoverYPosition */);
       return;
     }
 
@@ -891,7 +883,11 @@
   }
 
   private void logBasicOrCallImpression(DialerImpression.Type impressionType) {
-    DialerCall call = CallList.getInstance().getActiveOrBackgroundCall();
+    // Bubble is shown for outgoing, active or background call
+    DialerCall call = CallList.getInstance().getOutgoingCall();
+    if (call == null) {
+      call = CallList.getInstance().getActiveOrBackgroundCall();
+    }
     if (call != null) {
       Logger.get(context)
           .logCallImpression(impressionType, call.getUniqueCallId(), call.getTimeAddedMs());
@@ -982,8 +978,8 @@
       root.setOnBackPressedListener(
           () -> {
             if (visibility == Visibility.SHOWING && expanded) {
-              startCollapse(
-                  CollapseEnd.NOTHING, true /* isUserAction */, true /* shouldRecoverYPosition */);
+              logBasicOrCallImpression(DialerImpression.Type.BUBBLE_V2_CLICK_TO_COLLAPSE);
+              startCollapse(CollapseEnd.NOTHING, true /* shouldRecoverYPosition */);
               return true;
             }
             return false;
@@ -998,8 +994,8 @@
       root.setOnTouchListener(
           (v, event) -> {
             if (expanded && event.getActionMasked() == MotionEvent.ACTION_OUTSIDE) {
-              startCollapse(
-                  CollapseEnd.NOTHING, true /* isUserAction */, true /* shouldRecoverYPosition */);
+              logBasicOrCallImpression(DialerImpression.Type.BUBBLE_V2_CLICK_TO_COLLAPSE);
+              startCollapse(CollapseEnd.NOTHING, true /* shouldRecoverYPosition */);
               return true;
             }
             return false;
