Remove bubble v1.

Bug: 67605985
Test: manual
PiperOrigin-RevId: 184358120
Change-Id: I17288da2b059f18bd51247e27aa174c7994e6f05
diff --git a/g3doc/INTEGRATION.md b/g3doc/INTEGRATION.md
deleted file mode 100644
index 58ece7d..0000000
--- a/g3doc/INTEGRATION.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Floating Bubble Integration
-
-Author: keyboardr@
-
-Last Updated: 2017-06-06
-
-Floating bubbles provide a lightweight means of providing interactive UI while
-the user is away from the app. This document details the steps necessary to
-integrate these bubbles into your app.
-
-[TOC]
-
-![Floating bubble](images/bubble_collapsed.png){height=400}
-
-## Ensure Bubbles can be shown
-
-Add the `android.permission.SYSTEM_ALERT_WINDOW` permission to your manifest.
-Before you show the bubble, call `Bubble.canShowBubbles(Context)` to see if the
-user has granted you permission. If not, you can start an Activity from
-`Bubble.getRequestPermissionIntent(Context)` to navigate the user to the system
-settings to enable drawing over other apps. This is more than just a simple
-runtime permission; the user must explicitly allow you to draw over other apps
-via this system setting. System apps may have this allowed by default, but be
-sure to test.
-
-## Create your initial `BubbleInfo`
-
-Use `BubbleInfo.builder()` to populate a `BubbleInfo` with your color, main
-icon, main Intent (which should navigate back to your app), starting Y position,
-and a list of `Actions` to put in the drawer. Each `Action` will define its
-icon, user-displayable name (used for content description), Intent to perform
-when clicked, whether it is enabled (optional, default true), and whether it is
-checked (optional, default false).
-
-![Floating bubble expanded](images/bubble_expanded.png){height=400}
-
-## Create, show, and hide the Bubble
-
-Create the bubble using `Bubble.createBubble(Context, BubbleInfo)`. The `show()`
-method is safe to call at any time. If the Bubble is already showing, it is a
-no-op. `hide()` may also be called at any time and will collapse the drawer
-before hiding if already open. While `show()` will show immediately, `hide()`
-may need to wait for other operations or animations before the bubble is hidden.
-It is unlikely you will need to keep track of this, however. The bubble will be
-hidden at its next opportunity, and `hide()` will not block.
-
-![Floating bubble with state](images/bubble_state.png){height=400}
-
-## Update the Bubble's state
-
-Call `Bubble.setBubbleInfo(BubbleInfo)` to update all displayed state.
-`BubbleInfo`s are immutable, so to make a new one using an existing
-`BubbleInfo`, use `BubbleInfo.from(BubbleInfo)` to get a `Builder` with
-prepopulated info. If only the `Action` state has changed, it is more efficient
-to just call `Bubble.updateActions(List<Action>)`
-
-![Floating bubble with text](images/bubble_text.png){height=400}
-
-## Show text
-
-To temporarily replace the icon with a textual message, call
-`Bubble.showText(CharSequence)`. The text will be displayed for several seconds
-before transitioning back to the primary icon. The drawer will be closed if open
-and cannot be reopened while the text is displayed. Any calls to `hide()` will
-be deferred until after the text is done being displayed, so if you wish to show
-an ending message of some sort you may call `hide()` immediately after
-`showText(CharSequence)`.
diff --git a/g3doc/images/bubble_collapsed.png b/g3doc/images/bubble_collapsed.png
deleted file mode 100644
index 7ecc067..0000000
--- a/g3doc/images/bubble_collapsed.png
+++ /dev/null
Binary files differ
diff --git a/g3doc/images/bubble_expanded.png b/g3doc/images/bubble_expanded.png
deleted file mode 100644
index cd477f3..0000000
--- a/g3doc/images/bubble_expanded.png
+++ /dev/null
Binary files differ
diff --git a/g3doc/images/bubble_state.png b/g3doc/images/bubble_state.png
deleted file mode 100644
index 21ca8a8..0000000
--- a/g3doc/images/bubble_state.png
+++ /dev/null
Binary files differ
diff --git a/g3doc/images/bubble_text.png b/g3doc/images/bubble_text.png
deleted file mode 100644
index 9c476dc..0000000
--- a/g3doc/images/bubble_text.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/bubble/AndroidManifest.xml b/java/com/android/bubble/AndroidManifest.xml
deleted file mode 100644
index 80efe5c..0000000
--- a/java/com/android/bubble/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-  ~ 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
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.bubble">
-
-  <uses-sdk android:minSdkVersion="21"/>
-  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
-</manifest>
diff --git a/java/com/android/bubble/Bubble.java b/java/com/android/bubble/Bubble.java
deleted file mode 100644
index a25316f..0000000
--- a/java/com/android/bubble/Bubble.java
+++ /dev/null
@@ -1,977 +0,0 @@
-/*
- * 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.bubble;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
-import android.app.PendingIntent.CanceledException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.ColorStateList;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.Animatable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.RippleDrawable;
-import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-import android.os.Handler;
-import android.provider.Settings;
-import android.support.annotation.ColorInt;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.graphics.ColorUtils;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.view.animation.FastOutLinearInInterpolator;
-import android.support.v4.view.animation.LinearOutSlowInInterpolator;
-import android.transition.TransitionManager;
-import android.transition.TransitionValues;
-import android.view.ContextThemeWrapper;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.MarginLayoutParams;
-import android.view.ViewPropertyAnimator;
-import android.view.ViewTreeObserver.OnPreDrawListener;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.view.animation.AnticipateInterpolator;
-import android.view.animation.OvershootInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.ViewAnimator;
-import com.android.bubble.BubbleInfo.Action;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Creates and manages a bubble window from information in a {@link BubbleInfo}. Before creating, be
- * sure to check whether bubbles may be shown using {@link #canShowBubbles(Context)} and request
- * permission if necessary ({@link #getRequestPermissionIntent(Context)} is provided for
- * convenience)
- */
-public class Bubble {
-  // This class has some odd behavior that is not immediately obvious in order to avoid jank when
-  // resizing. See http://go/bubble-resize for details.
-
-  // How long text should show after showText(CharSequence) is called
-  private static final int SHOW_TEXT_DURATION_MILLIS = 3000;
-  // How long the new window should show before destroying the old one during resize operations.
-  // This ensures the new window has had time to draw first.
-  private static final int WINDOW_REDRAW_DELAY_MILLIS = 50;
-
-  private static Boolean canShowBubblesForTesting = null;
-
-  private final Context context;
-  private final WindowManager windowManager;
-
-  private final Handler handler;
-  private LayoutParams windowParams;
-
-  // Initialized in factory method
-  @SuppressWarnings("NullableProblems")
-  @NonNull
-  private BubbleInfo currentInfo;
-
-  @Visibility private int visibility;
-  @VisibleForTesting boolean expanded;
-  private boolean textShowing;
-  private boolean hideAfterText;
-  private CharSequence textAfterShow;
-  private int collapseEndAction;
-
-  @VisibleForTesting ViewHolder viewHolder;
-  private ViewPropertyAnimator collapseAnimation;
-  @VisibleForTesting Integer overrideGravity;
-  private ViewPropertyAnimator exitAnimator;
-
-  private final Runnable collapseRunnable =
-      new Runnable() {
-        @Override
-        public void run() {
-          textShowing = false;
-          if (hideAfterText) {
-            // Always reset here since text shouldn't keep showing.
-            hideAndReset();
-          } else {
-            doResize(
-                () -> viewHolder.getPrimaryButton().setDisplayedChild(ViewHolder.CHILD_INDEX_ICON));
-          }
-        }
-      };
-
-  private BubbleExpansionStateListener bubbleExpansionStateListener;
-
-  /** Type of action after bubble collapse */
-  @Retention(RetentionPolicy.SOURCE)
-  @IntDef({CollapseEnd.NOTHING, CollapseEnd.HIDE})
-  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  public @interface CollapseEnd {
-    int NOTHING = 0;
-    int HIDE = 1;
-  }
-
-  @Retention(RetentionPolicy.SOURCE)
-  @IntDef({Visibility.ENTERING, Visibility.SHOWING, Visibility.EXITING, Visibility.HIDDEN})
-  private @interface Visibility {
-    int HIDDEN = 0;
-    int ENTERING = 1;
-    int SHOWING = 2;
-    int EXITING = 3;
-  }
-
-  /** Indicate bubble expansion state. */
-  @Retention(RetentionPolicy.SOURCE)
-  @IntDef({ExpansionState.START_EXPANDING, ExpansionState.START_COLLAPSING})
-  public @interface ExpansionState {
-    // TODO(yueg): add more states when needed
-    int START_EXPANDING = 0;
-    int START_COLLAPSING = 1;
-  }
-
-  /**
-   * Determines whether bubbles can be shown based on permissions obtained. This should be checked
-   * before attempting to create a Bubble.
-   *
-   * @return true iff bubbles are able to be shown.
-   * @see Settings#canDrawOverlays(Context)
-   */
-  public static boolean canShowBubbles(@NonNull Context context) {
-    return canShowBubblesForTesting != null
-        ? canShowBubblesForTesting
-        : VERSION.SDK_INT < VERSION_CODES.M || Settings.canDrawOverlays(context);
-  }
-
-  @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-  public static void setCanShowBubblesForTesting(boolean canShowBubbles) {
-    canShowBubblesForTesting = canShowBubbles;
-  }
-
-  /** Returns an Intent to request permission to show overlays */
-  @NonNull
-  public static Intent getRequestPermissionIntent(@NonNull Context context) {
-    return new Intent(
-        Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
-        Uri.fromParts("package", context.getPackageName(), null));
-  }
-
-  /** Creates instances of Bubble. The default implementation just calls the constructor. */
-  @VisibleForTesting
-  public interface BubbleFactory {
-    Bubble createBubble(@NonNull Context context, @NonNull Handler handler);
-  }
-
-  private static BubbleFactory bubbleFactory = Bubble::new;
-
-  public static Bubble createBubble(@NonNull Context context, @NonNull BubbleInfo info) {
-    Bubble bubble = bubbleFactory.createBubble(context, new Handler());
-    bubble.setBubbleInfo(info);
-    return bubble;
-  }
-
-  @VisibleForTesting
-  public static void setBubbleFactory(@NonNull BubbleFactory bubbleFactory) {
-    Bubble.bubbleFactory = bubbleFactory;
-  }
-
-  @VisibleForTesting
-  public static void resetBubbleFactory() {
-    Bubble.bubbleFactory = Bubble::new;
-  }
-
-  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  Bubble(@NonNull Context context, @NonNull Handler handler) {
-    context = new ContextThemeWrapper(context, R.style.Theme_AppCompat);
-    this.context = context;
-    this.handler = handler;
-    windowManager = context.getSystemService(WindowManager.class);
-
-    viewHolder = new ViewHolder(context);
-  }
-
-  /** Expands the main bubble menu. */
-  public void expand(boolean isUserAction) {
-    if (bubbleExpansionStateListener != null) {
-      bubbleExpansionStateListener.onBubbleExpansionStateChanged(
-          ExpansionState.START_EXPANDING, isUserAction);
-    }
-    doResize(
-        () -> {
-          onLeftRightSwitch(isDrawingFromRight());
-          viewHolder.setDrawerVisibility(View.VISIBLE);
-        });
-    View expandedView = viewHolder.getExpandedView();
-    expandedView
-        .getViewTreeObserver()
-        .addOnPreDrawListener(
-            new OnPreDrawListener() {
-              @Override
-              public boolean onPreDraw() {
-                expandedView.getViewTreeObserver().removeOnPreDrawListener(this);
-                expandedView.setTranslationX(
-                    isDrawingFromRight() ? expandedView.getWidth() : -expandedView.getWidth());
-                expandedView
-                    .animate()
-                    .setInterpolator(new LinearOutSlowInInterpolator())
-                    .translationX(0);
-                return false;
-              }
-            });
-    setFocused(true);
-    expanded = true;
-  }
-
-  /**
-   * Make the bubble visible. Will show a short entrance animation as it enters. If the bubble is
-   * already showing this method does nothing.
-   */
-  public void show() {
-    if (collapseEndAction == CollapseEnd.HIDE) {
-      // If show() was called while collapsing, make sure we don't hide after.
-      collapseEndAction = CollapseEnd.NOTHING;
-    }
-    if (visibility == Visibility.SHOWING || visibility == Visibility.ENTERING) {
-      return;
-    }
-
-    hideAfterText = false;
-
-    if (windowParams == null) {
-      // Apps targeting O+ must use TYPE_APPLICATION_OVERLAY, which is not available prior to O.
-      @SuppressWarnings("deprecation")
-      @SuppressLint("InlinedApi")
-      int type =
-          BuildCompat.isAtLeastO()
-              ? LayoutParams.TYPE_APPLICATION_OVERLAY
-              : LayoutParams.TYPE_PHONE;
-
-      windowParams =
-          new LayoutParams(
-              type,
-              LayoutParams.FLAG_NOT_TOUCH_MODAL
-                  | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
-                  | LayoutParams.FLAG_NOT_FOCUSABLE
-                  | LayoutParams.FLAG_LAYOUT_NO_LIMITS,
-              PixelFormat.TRANSLUCENT);
-      windowParams.gravity = Gravity.TOP | Gravity.LEFT;
-      windowParams.x = context.getResources().getDimensionPixelOffset(R.dimen.bubble_safe_margin_x);
-      windowParams.y = currentInfo.getStartingYPosition();
-      windowParams.height = LayoutParams.WRAP_CONTENT;
-      windowParams.width = LayoutParams.WRAP_CONTENT;
-    }
-
-    if (exitAnimator != null) {
-      exitAnimator.cancel();
-      exitAnimator = null;
-    } else {
-      windowManager.addView(viewHolder.getRoot(), windowParams);
-      viewHolder.getPrimaryButton().setScaleX(0);
-      viewHolder.getPrimaryButton().setScaleY(0);
-    }
-
-    viewHolder.setChildClickable(true);
-    visibility = Visibility.ENTERING;
-    viewHolder
-        .getPrimaryButton()
-        .animate()
-        .setInterpolator(new OvershootInterpolator())
-        .scaleX(1)
-        .scaleY(1)
-        .withEndAction(
-            () -> {
-              visibility = Visibility.SHOWING;
-              // Show the queued up text, if available.
-              if (textAfterShow != null) {
-                showText(textAfterShow);
-                textAfterShow = null;
-              }
-            })
-        .start();
-
-    updatePrimaryIconAnimation();
-  }
-
-  /** Hide the bubble. */
-  public void hide() {
-    if (hideAfterText) {
-      // hideAndReset() will be called after showing text, do nothing here.
-      return;
-    }
-    hideHelper(this::defaultAfterHidingAnimation);
-  }
-
-  /** Hide the bubble and reset {@viewHolder} to initial state */
-  public void hideAndReset() {
-    hideHelper(
-        () -> {
-          defaultAfterHidingAnimation();
-          reset();
-        });
-  }
-
-  /** Returns whether the bubble is currently visible */
-  public boolean isVisible() {
-    return visibility == Visibility.SHOWING
-        || visibility == Visibility.ENTERING
-        || visibility == Visibility.EXITING;
-  }
-
-  /**
-   * Set the info for this Bubble to display
-   *
-   * @param bubbleInfo the BubbleInfo to display in this Bubble.
-   */
-  public void setBubbleInfo(@NonNull BubbleInfo bubbleInfo) {
-    currentInfo = bubbleInfo;
-    update();
-  }
-
-  /**
-   * Update the state and behavior of actions.
-   *
-   * @param actions the new state of the bubble's actions
-   */
-  public void updateActions(@NonNull List<Action> actions) {
-    currentInfo = BubbleInfo.from(currentInfo).setActions(actions).build();
-    updateButtonStates();
-  }
-
-  /** Returns the currently displayed BubbleInfo */
-  public BubbleInfo getBubbleInfo() {
-    return currentInfo;
-  }
-
-  /**
-   * Display text in the main bubble. The bubble's drawer is not expandable while text is showing,
-   * and the drawer will be closed if already open.
-   *
-   * @param text the text to display to the user
-   */
-  public void showText(@NonNull CharSequence text) {
-    textShowing = true;
-    if (expanded) {
-      startCollapse(CollapseEnd.NOTHING, false);
-      doShowText(text);
-    } else {
-      // Need to transition from old bounds to new bounds manually
-      ChangeOnScreenBounds transition = new ChangeOnScreenBounds();
-      // Prepare and capture start values
-      TransitionValues startValues = new TransitionValues();
-      startValues.view = viewHolder.getPrimaryButton();
-      transition.addTarget(startValues.view);
-      transition.captureStartValues(startValues);
-
-      // If our view is not laid out yet, postpone showing the text.
-      if (startValues.values.isEmpty()) {
-        textAfterShow = text;
-        return;
-      }
-
-      doResize(
-          () -> {
-            doShowText(text);
-            // Hide the text so we can animate it in
-            viewHolder.getPrimaryText().setAlpha(0);
-
-            ViewAnimator primaryButton = viewHolder.getPrimaryButton();
-            // Cancel the automatic transition scheduled in doShowText
-            TransitionManager.endTransitions((ViewGroup) primaryButton.getParent());
-            primaryButton
-                .getViewTreeObserver()
-                .addOnPreDrawListener(
-                    new OnPreDrawListener() {
-                      @Override
-                      public boolean onPreDraw() {
-                        primaryButton.getViewTreeObserver().removeOnPreDrawListener(this);
-
-                        // Prepare and capture end values, always use the size of primaryText since
-                        // its invisibility makes primaryButton smaller than expected
-                        TransitionValues endValues = new TransitionValues();
-                        endValues.values.put(
-                            ChangeOnScreenBounds.PROPNAME_WIDTH,
-                            viewHolder.getPrimaryText().getWidth());
-                        endValues.values.put(
-                            ChangeOnScreenBounds.PROPNAME_HEIGHT,
-                            viewHolder.getPrimaryText().getHeight());
-                        endValues.view = primaryButton;
-                        transition.addTarget(endValues.view);
-                        transition.captureEndValues(endValues);
-
-                        // animate the primary button bounds change
-                        Animator bounds =
-                            transition.createAnimator(primaryButton, startValues, endValues);
-
-                        // Animate the text in
-                        Animator alpha =
-                            ObjectAnimator.ofFloat(viewHolder.getPrimaryText(), View.ALPHA, 1f);
-
-                        AnimatorSet set = new AnimatorSet();
-                        set.play(bounds).before(alpha);
-                        set.start();
-                        return false;
-                      }
-                    });
-          });
-    }
-    handler.removeCallbacks(collapseRunnable);
-    handler.postDelayed(collapseRunnable, SHOW_TEXT_DURATION_MILLIS);
-  }
-
-  public void setBubbleExpansionStateListener(
-      BubbleExpansionStateListener bubbleExpansionStateListener) {
-    this.bubbleExpansionStateListener = bubbleExpansionStateListener;
-  }
-
-  @Nullable
-  Integer getGravityOverride() {
-    return overrideGravity;
-  }
-
-  void onMoveStart() {
-    startCollapse(CollapseEnd.NOTHING, true);
-    viewHolder
-        .getPrimaryButton()
-        .animate()
-        .translationZ(
-            context.getResources().getDimensionPixelOffset(R.dimen.bubble_move_elevation_change));
-  }
-
-  void onMoveFinish() {
-    viewHolder.getPrimaryButton().animate().translationZ(0);
-    // If it's GONE, no resize is necessary. If it's VISIBLE, it will get cleaned up when the
-    // collapse animation finishes
-    if (viewHolder.getExpandedView().getVisibility() == View.INVISIBLE) {
-      doResize(null);
-    }
-  }
-
-  void primaryButtonClick() {
-    // Send primary intent if not to expand.
-    if (expanded || textShowing || currentInfo.getActions().isEmpty()) {
-      try {
-        currentInfo.getPrimaryIntent().send();
-      } catch (CanceledException e) {
-        throw new RuntimeException(e);
-      }
-      return;
-    }
-
-    expand(true);
-  }
-
-  void onLeftRightSwitch(boolean onRight) {
-    if (viewHolder.isMoving()) {
-      if (viewHolder.getExpandedView().getVisibility() == View.GONE) {
-        // If the drawer is not part of the layout we don't need to do anything. Layout flips will
-        // happen if necessary when opening the drawer.
-        return;
-      }
-    }
-
-    viewHolder
-        .getRoot()
-        .setLayoutDirection(onRight ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
-    View primaryContainer = viewHolder.getRoot().findViewById(R.id.bubble_primary_container);
-    ViewGroup.LayoutParams layoutParams = primaryContainer.getLayoutParams();
-    ((FrameLayout.LayoutParams) layoutParams).gravity = onRight ? Gravity.RIGHT : Gravity.LEFT;
-    primaryContainer.setLayoutParams(layoutParams);
-  }
-
-  LayoutParams getWindowParams() {
-    return windowParams;
-  }
-
-  View getRootView() {
-    return viewHolder.getRoot();
-  }
-
-  /**
-   * Hide the bubble if visible. Will run a short exit animation and before hiding, and {@code
-   * afterHiding} after hiding. If the bubble is currently showing text, will hide after the text is
-   * done displaying. If the bubble is not visible this method does nothing.
-   */
-  private void hideHelper(Runnable afterHiding) {
-    if (visibility == Visibility.HIDDEN || visibility == Visibility.EXITING) {
-      return;
-    }
-
-    // Make bubble non clickable to prevent further buggy actions
-    viewHolder.setChildClickable(false);
-
-    if (textShowing) {
-      hideAfterText = true;
-      return;
-    }
-
-    if (collapseAnimation != null) {
-      collapseEndAction = CollapseEnd.HIDE;
-      return;
-    }
-
-    if (expanded) {
-      startCollapse(CollapseEnd.HIDE, false);
-      return;
-    }
-
-    visibility = Visibility.EXITING;
-    exitAnimator =
-        viewHolder
-            .getPrimaryButton()
-            .animate()
-            .setInterpolator(new AnticipateInterpolator())
-            .scaleX(0)
-            .scaleY(0)
-            .withEndAction(afterHiding);
-    exitAnimator.start();
-  }
-
-  private void reset() {
-    viewHolder = new ViewHolder(viewHolder.getRoot().getContext());
-    update();
-  }
-
-  private void update() {
-    RippleDrawable backgroundRipple =
-        (RippleDrawable)
-            context.getResources().getDrawable(R.drawable.bubble_ripple_circle, context.getTheme());
-    int primaryTint =
-        ColorUtils.compositeColors(
-            context.getColor(R.color.bubble_primary_background_darken),
-            currentInfo.getPrimaryColor());
-    backgroundRipple.getDrawable(0).setTint(primaryTint);
-    viewHolder.getPrimaryButton().setBackground(backgroundRipple);
-
-    for (CheckableImageButton button : viewHolder.getActionButtons()) {
-      setBackgroundDrawable(button, primaryTint);
-    }
-
-    int numButtons = currentInfo.getActions().size();
-    for (CheckableImageButton button : viewHolder.getThirdButtons()) {
-      button.setVisibility(numButtons < 3 ? View.GONE : View.VISIBLE);
-    }
-    for (CheckableImageButton button : viewHolder.getSecondButtons()) {
-      button.setVisibility(numButtons < 2 ? View.GONE : View.VISIBLE);
-    }
-
-    viewHolder.getPrimaryIcon().setImageIcon(currentInfo.getPrimaryIcon());
-    updatePrimaryIconAnimation();
-    for (View expandedView : viewHolder.getExpandedViews()) {
-      expandedView.setBackgroundTintList(ColorStateList.valueOf(currentInfo.getPrimaryColor()));
-    }
-
-    updateButtonStates();
-  }
-
-  private void updatePrimaryIconAnimation() {
-    Drawable drawable = viewHolder.getPrimaryIcon().getDrawable();
-    if (drawable instanceof Animatable) {
-      if (isVisible()) {
-        ((Animatable) drawable).start();
-      } else {
-        ((Animatable) drawable).stop();
-      }
-    }
-  }
-
-  private void setBackgroundDrawable(CheckableImageButton view, @ColorInt int color) {
-    RippleDrawable itemRipple =
-        (RippleDrawable)
-            context
-                .getResources()
-                .getDrawable(R.drawable.bubble_ripple_checkable_circle, context.getTheme());
-    itemRipple.getDrawable(0).setTint(color);
-    view.setBackground(itemRipple);
-  }
-
-  private void updateButtonStates() {
-    int numButtons = currentInfo.getActions().size();
-
-    if (numButtons >= 1) {
-      for (CheckableImageButton button : viewHolder.getFirstButtons()) {
-        configureButton(currentInfo.getActions().get(0), button);
-      }
-      if (numButtons >= 2) {
-        for (CheckableImageButton button : viewHolder.getSecondButtons()) {
-          configureButton(currentInfo.getActions().get(1), button);
-        }
-        if (numButtons >= 3) {
-          for (CheckableImageButton button : viewHolder.getThirdButtons()) {
-            configureButton(currentInfo.getActions().get(2), button);
-          }
-        }
-      }
-    }
-  }
-
-  private void doShowText(@NonNull CharSequence text) {
-    TransitionManager.beginDelayedTransition((ViewGroup) viewHolder.getPrimaryButton().getParent());
-    viewHolder.getPrimaryText().setText(text);
-    viewHolder.getPrimaryButton().setDisplayedChild(ViewHolder.CHILD_INDEX_TEXT);
-  }
-
-  private void configureButton(Action action, CheckableImageButton button) {
-    action
-        .getIcon()
-        .loadDrawableAsync(
-            context,
-            d -> {
-              button.setImageIcon(action.getIcon());
-              button.setContentDescription(action.getName());
-              button.setChecked(action.isChecked());
-              button.setEnabled(action.isEnabled());
-            },
-            handler);
-    button.setOnClickListener(v -> doAction(action));
-  }
-
-  private void doAction(Action action) {
-    try {
-      action.getIntent().send();
-    } catch (CanceledException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  private void doResize(@Nullable Runnable operation) {
-    // If we're resizing on the right side of the screen, there is an implicit move operation
-    // necessary. The WindowManager does not sync the move and resize operations, so serious jank
-    // would occur. To fix this, instead of resizing the window, we create a new one and destroy
-    // the old one. There is a short delay before destroying the old view to ensure the new one has
-    // had time to draw.
-    ViewHolder oldViewHolder = viewHolder;
-    if (isDrawingFromRight()) {
-      viewHolder = new ViewHolder(oldViewHolder.getRoot().getContext());
-      update();
-      viewHolder
-          .getPrimaryButton()
-          .setDisplayedChild(oldViewHolder.getPrimaryButton().getDisplayedChild());
-      viewHolder.getPrimaryText().setText(oldViewHolder.getPrimaryText().getText());
-    }
-
-    if (operation != null) {
-      operation.run();
-    }
-
-    if (isDrawingFromRight()) {
-      swapViewHolders(oldViewHolder);
-    }
-  }
-
-  private void swapViewHolders(ViewHolder oldViewHolder) {
-    oldViewHolder.getShadowProvider().setVisibility(View.GONE);
-    ViewGroup root = viewHolder.getRoot();
-    windowManager.addView(root, windowParams);
-    root.getViewTreeObserver()
-        .addOnPreDrawListener(
-            new OnPreDrawListener() {
-              @Override
-              public boolean onPreDraw() {
-                root.getViewTreeObserver().removeOnPreDrawListener(this);
-                // Wait a bit before removing the old view; make sure the new one has drawn over it.
-                handler.postDelayed(
-                    () -> windowManager.removeView(oldViewHolder.getRoot()),
-                    WINDOW_REDRAW_DELAY_MILLIS);
-                return true;
-              }
-            });
-  }
-
-  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  public void startCollapse(@CollapseEnd int endAction, boolean isUserAction) {
-    View expandedView = viewHolder.getExpandedView();
-    if (expandedView.getVisibility() != View.VISIBLE || collapseAnimation != null) {
-      // Drawer is already collapsed or animation is running.
-      return;
-    }
-
-    overrideGravity = isDrawingFromRight() ? Gravity.RIGHT : Gravity.LEFT;
-    setFocused(false);
-
-    if (collapseEndAction == CollapseEnd.NOTHING) {
-      collapseEndAction = endAction;
-    }
-    if (bubbleExpansionStateListener != null && collapseEndAction == CollapseEnd.NOTHING) {
-      bubbleExpansionStateListener.onBubbleExpansionStateChanged(
-          ExpansionState.START_COLLAPSING, isUserAction);
-    }
-    collapseAnimation =
-        expandedView
-            .animate()
-            .translationX(isDrawingFromRight() ? expandedView.getWidth() : -expandedView.getWidth())
-            .setInterpolator(new FastOutLinearInInterpolator())
-            .withEndAction(
-                () -> {
-                  collapseAnimation = null;
-                  expanded = false;
-
-                  if (textShowing) {
-                    // Will do resize once the text is done.
-                    return;
-                  }
-
-                  // Hide the drawer and resize if possible.
-                  viewHolder.setDrawerVisibility(View.INVISIBLE);
-                  if (!viewHolder.isMoving() || !isDrawingFromRight()) {
-                    doResize(() -> viewHolder.setDrawerVisibility(View.GONE));
-                  }
-
-                  // If this collapse was to come before a hide, do it now.
-                  if (collapseEndAction == CollapseEnd.HIDE) {
-                    hide();
-                  }
-                  collapseEndAction = CollapseEnd.NOTHING;
-
-                  // Resume normal gravity after any resizing is done.
-                  handler.postDelayed(
-                      () -> {
-                        overrideGravity = null;
-                        if (!viewHolder.isMoving()) {
-                          viewHolder.undoGravityOverride();
-                        }
-                      },
-                      // Need to wait twice as long for resize and layout
-                      WINDOW_REDRAW_DELAY_MILLIS * 2);
-                });
-  }
-
-  private boolean isDrawingFromRight() {
-    return (windowParams.gravity & Gravity.RIGHT) == Gravity.RIGHT;
-  }
-
-  private void setFocused(boolean focused) {
-    if (focused) {
-      windowParams.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE;
-    } else {
-      windowParams.flags |= LayoutParams.FLAG_NOT_FOCUSABLE;
-    }
-    windowManager.updateViewLayout(getRootView(), windowParams);
-  }
-
-  private void defaultAfterHidingAnimation() {
-    exitAnimator = null;
-    windowManager.removeView(viewHolder.getRoot());
-    visibility = Visibility.HIDDEN;
-
-    updatePrimaryIconAnimation();
-  }
-
-  @VisibleForTesting
-  class ViewHolder {
-
-    public static final int CHILD_INDEX_ICON = 0;
-    public static final int CHILD_INDEX_TEXT = 1;
-
-    private MoveHandler moveHandler;
-    private final WindowRoot root;
-    private final ViewAnimator primaryButton;
-    private final ImageView primaryIcon;
-    private final TextView primaryText;
-
-    private final CheckableImageButton firstButton;
-    private final CheckableImageButton firstButtonRtl;
-    private final CheckableImageButton secondButton;
-    private final CheckableImageButton secondButtonRtl;
-    private final CheckableImageButton thirdButton;
-    private final CheckableImageButton thirdButtonRtl;
-    private final View expandedView;
-    private final View expandedViewRtl;
-    private final View shadowProvider;
-    private final View shadowProviderRtl;
-
-    public ViewHolder(Context context) {
-      // Window root is not in the layout file so that the inflater has a view to inflate into
-      this.root = new WindowRoot(context);
-      LayoutInflater inflater = LayoutInflater.from(root.getContext());
-      View contentView = inflater.inflate(R.layout.bubble_base, root, true);
-      expandedView = contentView.findViewById(R.id.bubble_expanded_layout);
-      expandedViewRtl = contentView.findViewById(R.id.bubble_expanded_layout_rtl);
-      primaryButton = contentView.findViewById(R.id.bubble_button_primary);
-      primaryIcon = contentView.findViewById(R.id.bubble_icon_primary);
-      primaryText = contentView.findViewById(R.id.bubble_text);
-      shadowProvider = contentView.findViewById(R.id.bubble_drawer_shadow_provider);
-      shadowProviderRtl = contentView.findViewById(R.id.bubble_drawer_shadow_provider_rtl);
-
-      firstButton = contentView.findViewById(R.id.bubble_icon_first);
-      firstButtonRtl = contentView.findViewById(R.id.bubble_icon_first_rtl);
-      secondButton = contentView.findViewById(R.id.bubble_icon_second);
-      secondButtonRtl = contentView.findViewById(R.id.bubble_icon_second_rtl);
-      thirdButton = contentView.findViewById(R.id.bubble_icon_third);
-      thirdButtonRtl = contentView.findViewById(R.id.bubble_icon_third_rtl);
-
-      root.setOnBackPressedListener(
-          () -> {
-            if (visibility == Visibility.SHOWING && expanded) {
-              startCollapse(CollapseEnd.NOTHING, true);
-              return true;
-            }
-            return false;
-          });
-      root.setOnConfigurationChangedListener(
-          (configuration) -> {
-            // The values in the current MoveHandler may be stale, so replace it. Then ensure the
-            // Window is in bounds
-            moveHandler = new MoveHandler(primaryButton, Bubble.this);
-            moveHandler.snapToBounds();
-          });
-      root.setOnTouchListener(
-          (v, event) -> {
-            if (expanded && event.getActionMasked() == MotionEvent.ACTION_OUTSIDE) {
-              startCollapse(CollapseEnd.NOTHING, true);
-              return true;
-            }
-            return false;
-          });
-      expandedView
-          .getViewTreeObserver()
-          .addOnDrawListener(
-              () -> {
-                int translationX = (int) expandedView.getTranslationX();
-                int parentOffset =
-                    ((MarginLayoutParams) ((ViewGroup) expandedView.getParent()).getLayoutParams())
-                        .leftMargin;
-                int minRight =
-                    shadowProvider.getLeft()
-                        + context.getResources().getDimensionPixelSize(R.dimen.bubble_size);
-                shadowProvider.setRight(
-                    Math.max(minRight, expandedView.getRight() + translationX + parentOffset));
-              });
-      expandedViewRtl
-          .getViewTreeObserver()
-          .addOnDrawListener(
-              () -> {
-                int translationX = (int) expandedViewRtl.getTranslationX();
-                int parentOffset =
-                    ((MarginLayoutParams)
-                            ((ViewGroup) expandedViewRtl.getParent()).getLayoutParams())
-                        .leftMargin;
-                int maxLeft =
-                    shadowProviderRtl.getRight()
-                        - context.getResources().getDimensionPixelSize(R.dimen.bubble_size);
-                shadowProviderRtl.setLeft(
-                    Math.min(maxLeft, expandedViewRtl.getLeft() + translationX + parentOffset));
-              });
-      moveHandler = new MoveHandler(primaryButton, Bubble.this);
-    }
-
-    private void setChildClickable(boolean clickable) {
-      for (CheckableImageButton button : getActionButtons()) {
-        button.setClickable(clickable);
-      }
-
-      primaryButton.setOnTouchListener(clickable ? moveHandler : null);
-    }
-
-    public ViewGroup getRoot() {
-      return root;
-    }
-
-    public ViewAnimator getPrimaryButton() {
-      return primaryButton;
-    }
-
-    public ImageView getPrimaryIcon() {
-      return primaryIcon;
-    }
-
-    public TextView getPrimaryText() {
-      return primaryText;
-    }
-
-    /** Get list of all the action buttons from both LTR/RTL drawers. */
-    public List<CheckableImageButton> getActionButtons() {
-      return Arrays.asList(
-          firstButton, firstButtonRtl, secondButton, secondButtonRtl, thirdButton, thirdButtonRtl);
-    }
-
-    /** Get the first action button used in the current orientation drawer. */
-    public CheckableImageButton getFirstButton() {
-      return isDrawingFromRight() ? firstButtonRtl : firstButton;
-    }
-
-    /** Get both of the first action buttons from both LTR/RTL drawers. */
-    public List<CheckableImageButton> getFirstButtons() {
-      return Arrays.asList(firstButton, firstButtonRtl);
-    }
-
-    /** Get the second action button used in the current orientation drawer. */
-    public CheckableImageButton getSecondButton() {
-      return isDrawingFromRight() ? secondButtonRtl : secondButton;
-    }
-
-    /** Get both of the second action buttons from both LTR/RTL drawers. */
-    public List<CheckableImageButton> getSecondButtons() {
-      return Arrays.asList(secondButton, secondButtonRtl);
-    }
-
-    /** Get the third action button used in the current orientation drawer. */
-    public CheckableImageButton getThirdButton() {
-      return isDrawingFromRight() ? thirdButtonRtl : thirdButton;
-    }
-
-    /** Get both of the third action buttons from both LTR/RTL drawers. */
-    public List<CheckableImageButton> getThirdButtons() {
-      return Arrays.asList(thirdButton, thirdButtonRtl);
-    }
-
-    /** Get the correct expanded view used in current bubble orientation. */
-    public View getExpandedView() {
-      return isDrawingFromRight() ? expandedViewRtl : expandedView;
-    }
-
-    /** Get both views of the LTR and RTL drawers. */
-    public List<View> getExpandedViews() {
-      return Arrays.asList(expandedView, expandedViewRtl);
-    }
-
-    /** Get the correct shadow provider view used in current bubble orientation. */
-    public View getShadowProvider() {
-      return isDrawingFromRight() ? shadowProviderRtl : shadowProvider;
-    }
-
-    public void setDrawerVisibility(int visibility) {
-      if (isDrawingFromRight()) {
-        expandedViewRtl.setVisibility(visibility);
-        shadowProviderRtl.setVisibility(visibility);
-      } else {
-        expandedView.setVisibility(visibility);
-        shadowProvider.setVisibility(visibility);
-      }
-    }
-
-    public boolean isMoving() {
-      return moveHandler.isMoving();
-    }
-
-    public void undoGravityOverride() {
-      moveHandler.undoGravityOverride();
-    }
-  }
-
-  /** Listener for bubble expansion state change. */
-  public interface BubbleExpansionStateListener {
-    void onBubbleExpansionStateChanged(@ExpansionState int expansionState, boolean isUserAction);
-  }
-}
diff --git a/java/com/android/bubble/BubbleInfo.java b/java/com/android/bubble/BubbleInfo.java
deleted file mode 100644
index b4f81b3..0000000
--- a/java/com/android/bubble/BubbleInfo.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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.bubble;
-
-import android.app.PendingIntent;
-import android.graphics.drawable.Icon;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.Px;
-import com.google.auto.value.AutoValue;
-import java.util.Collections;
-import java.util.List;
-
-/** Info for displaying a {@link Bubble} */
-@AutoValue
-public abstract class BubbleInfo {
-  @ColorInt
-  public abstract int getPrimaryColor();
-
-  @NonNull
-  public abstract Icon getPrimaryIcon();
-
-  @NonNull
-  public abstract PendingIntent getPrimaryIntent();
-
-  @Px
-  public abstract int getStartingYPosition();
-
-  @NonNull
-  public abstract List<Action> getActions();
-
-  public static Builder builder() {
-    return new AutoValue_BubbleInfo.Builder().setActions(Collections.emptyList());
-  }
-
-  public static Builder from(@NonNull BubbleInfo bubbleInfo) {
-    return builder()
-        .setPrimaryIntent(bubbleInfo.getPrimaryIntent())
-        .setPrimaryColor(bubbleInfo.getPrimaryColor())
-        .setPrimaryIcon(bubbleInfo.getPrimaryIcon())
-        .setStartingYPosition(bubbleInfo.getStartingYPosition())
-        .setActions(bubbleInfo.getActions());
-  }
-
-  /** Builder for {@link BubbleInfo} */
-  @AutoValue.Builder
-  public abstract static class Builder {
-
-    public abstract Builder setPrimaryColor(@ColorInt int primaryColor);
-
-    public abstract Builder setPrimaryIcon(@NonNull Icon primaryIcon);
-
-    public abstract Builder setPrimaryIntent(@NonNull PendingIntent primaryIntent);
-
-    public abstract Builder setStartingYPosition(@Px int startingYPosition);
-
-    public abstract Builder setActions(List<Action> actions);
-
-    public abstract BubbleInfo build();
-  }
-
-  /** Represents actions to be shown in the bubble when expanded */
-  @AutoValue
-  public abstract static class Action {
-
-    @NonNull
-    public abstract Icon getIcon();
-
-    @NonNull
-    public abstract CharSequence getName();
-
-    @NonNull
-    public abstract PendingIntent getIntent();
-
-    public abstract boolean isEnabled();
-
-    public abstract boolean isChecked();
-
-    public static Builder builder() {
-      return new AutoValue_BubbleInfo_Action.Builder().setEnabled(true).setChecked(false);
-    }
-
-    public static Builder from(@NonNull Action action) {
-      return builder()
-          .setIntent(action.getIntent())
-          .setChecked(action.isChecked())
-          .setEnabled(action.isEnabled())
-          .setName(action.getName())
-          .setIcon(action.getIcon());
-    }
-
-    /** Builder for {@link Action} */
-    @AutoValue.Builder
-    public abstract static class Builder {
-
-      public abstract Builder setIcon(@NonNull Icon icon);
-
-      public abstract Builder setName(@NonNull CharSequence name);
-
-      public abstract Builder setIntent(@NonNull PendingIntent intent);
-
-      public abstract Builder setEnabled(boolean enabled);
-
-      public abstract Builder setChecked(boolean checked);
-
-      public abstract Action build();
-    }
-  }
-}
diff --git a/java/com/android/bubble/ChangeOnScreenBounds.java b/java/com/android/bubble/ChangeOnScreenBounds.java
deleted file mode 100644
index 0a7adf6..0000000
--- a/java/com/android/bubble/ChangeOnScreenBounds.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * 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.bubble;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.graphics.Path;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.support.annotation.VisibleForTesting;
-import android.transition.Transition;
-import android.transition.TransitionValues;
-import android.util.Property;
-import android.view.View;
-import android.view.ViewGroup;
-
-/** Similar to {@link android.transition.ChangeBounds ChangeBounds} but works across windows */
-public class ChangeOnScreenBounds extends Transition {
-
-  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  static final String PROPNAME_BOUNDS = "bubble:changeScreenBounds:bounds";
-
-  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  static final String PROPNAME_SCREEN_X = "bubble:changeScreenBounds:screenX";
-
-  @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-  static final String PROPNAME_SCREEN_Y = "bubble:changeScreenBounds:screenY";
-
-  static final String PROPNAME_WIDTH = "bubble:changeScreenBounds:width";
-  static final String PROPNAME_HEIGHT = "bubble:changeScreenBounds:height";
-
-  private static final Property<ViewBounds, PointF> TOP_LEFT_PROPERTY =
-      new Property<ViewBounds, PointF>(PointF.class, "topLeft") {
-        @Override
-        public void set(ViewBounds viewBounds, PointF topLeft) {
-          viewBounds.setTopLeft(topLeft);
-        }
-
-        @Override
-        public PointF get(ViewBounds viewBounds) {
-          return null;
-        }
-      };
-
-  private static final Property<ViewBounds, PointF> BOTTOM_RIGHT_PROPERTY =
-      new Property<ViewBounds, PointF>(PointF.class, "bottomRight") {
-        @Override
-        public void set(ViewBounds viewBounds, PointF bottomRight) {
-          viewBounds.setBottomRight(bottomRight);
-        }
-
-        @Override
-        public PointF get(ViewBounds viewBounds) {
-          return null;
-        }
-      };
-  private final int[] tempLocation = new int[2];
-
-  @Override
-  public void captureStartValues(TransitionValues transitionValues) {
-    captureValuesWithSize(transitionValues);
-  }
-
-  @Override
-  public void captureEndValues(TransitionValues transitionValues) {
-    captureValuesWithSize(transitionValues);
-  }
-
-  /**
-   * Capture location (left and top) from {@code values.view} and size (width and height) from
-   * {@code values.values}. If size is not set, use the size of {@code values.view}.
-   */
-  private void captureValuesWithSize(TransitionValues values) {
-    View view = values.view;
-
-    if (view.isLaidOut() || view.getWidth() != 0 || view.getHeight() != 0) {
-      Integer width = (Integer) values.values.get(PROPNAME_WIDTH);
-      Integer height = (Integer) values.values.get(PROPNAME_HEIGHT);
-
-      values.values.put(
-          PROPNAME_BOUNDS,
-          new Rect(
-              view.getLeft(),
-              view.getTop(),
-              width == null ? view.getRight() : view.getLeft() + width,
-              height == null ? view.getBottom() : view.getTop() + height));
-      values.view.getLocationOnScreen(tempLocation);
-      values.values.put(PROPNAME_SCREEN_X, tempLocation[0]);
-      values.values.put(PROPNAME_SCREEN_Y, tempLocation[1]);
-    }
-  }
-
-  @Override
-  public Animator createAnimator(
-      ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {
-    Rect startBounds = (Rect) startValues.values.get(PROPNAME_BOUNDS);
-    Rect endBounds = (Rect) endValues.values.get(PROPNAME_BOUNDS);
-
-    if (startBounds == null || endBounds == null) {
-      // start or end values were not captured, so don't animate.
-      return null;
-    }
-
-    // Offset the startBounds by the difference in screen position
-    int startScreenX = (Integer) startValues.values.get(PROPNAME_SCREEN_X);
-    int startScreenY = (Integer) startValues.values.get(PROPNAME_SCREEN_Y);
-    int endScreenX = (Integer) endValues.values.get(PROPNAME_SCREEN_X);
-    int endScreenY = (Integer) endValues.values.get(PROPNAME_SCREEN_Y);
-    startBounds.offset(startScreenX - endScreenX, startScreenY - endScreenY);
-
-    final int startLeft = startBounds.left;
-    final int endLeft = endBounds.left;
-    final int startTop = startBounds.top;
-    final int endTop = endBounds.top;
-    final int startRight = startBounds.right;
-    final int endRight = endBounds.right;
-    final int startBottom = startBounds.bottom;
-    final int endBottom = endBounds.bottom;
-    ViewBounds viewBounds = new ViewBounds(endValues.view);
-    viewBounds.setTopLeft(new PointF(startLeft, startTop));
-    viewBounds.setBottomRight(new PointF(startRight, startBottom));
-
-    // Animate the top left and bottom right corners along a path
-    Path topLeftPath = getPathMotion().getPath(startLeft, startTop, endLeft, endTop);
-    ObjectAnimator topLeftAnimator =
-        ObjectAnimator.ofObject(viewBounds, TOP_LEFT_PROPERTY, null, topLeftPath);
-
-    Path bottomRightPath = getPathMotion().getPath(startRight, startBottom, endRight, endBottom);
-    ObjectAnimator bottomRightAnimator =
-        ObjectAnimator.ofObject(viewBounds, BOTTOM_RIGHT_PROPERTY, null, bottomRightPath);
-    AnimatorSet set = new AnimatorSet();
-    set.playTogether(topLeftAnimator, bottomRightAnimator);
-    return set;
-  }
-
-  private static class ViewBounds {
-    private int left;
-    private int top;
-    private int right;
-    private int bottom;
-    private final View view;
-    private int topLeftCalls;
-    private int bottomRightCalls;
-
-    public ViewBounds(View view) {
-      this.view = view;
-    }
-
-    public void setTopLeft(PointF topLeft) {
-      left = Math.round(topLeft.x);
-      top = Math.round(topLeft.y);
-      topLeftCalls++;
-      if (topLeftCalls == bottomRightCalls) {
-        updateLeftTopRightBottom();
-      }
-    }
-
-    public void setBottomRight(PointF bottomRight) {
-      right = Math.round(bottomRight.x);
-      bottom = Math.round(bottomRight.y);
-      bottomRightCalls++;
-      if (topLeftCalls == bottomRightCalls) {
-        updateLeftTopRightBottom();
-      }
-    }
-
-    private void updateLeftTopRightBottom() {
-      view.setLeft(left);
-      view.setTop(top);
-      view.setRight(right);
-      view.setBottom(bottom);
-      topLeftCalls = 0;
-      bottomRightCalls = 0;
-    }
-  }
-}
diff --git a/java/com/android/bubble/CheckableImageButton.java b/java/com/android/bubble/CheckableImageButton.java
deleted file mode 100644
index dd9acce..0000000
--- a/java/com/android/bubble/CheckableImageButton.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.bubble;
-
-import android.content.Context;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v7.widget.AppCompatImageButton;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.Checkable;
-
-/**
- * An {@link android.widget.ImageButton ImageButton} that implements {@link Checkable} and
- * propagates the checkable state
- */
-public class CheckableImageButton extends AppCompatImageButton implements Checkable {
-
-  // Copied without modification from AppCompat library
-
-  private static final int[] DRAWABLE_STATE_CHECKED = new int[] {android.R.attr.state_checked};
-
-  private boolean mChecked;
-
-  public CheckableImageButton(Context context) {
-    this(context, null);
-  }
-
-  public CheckableImageButton(Context context, AttributeSet attrs) {
-    this(context, attrs, android.R.attr.imageButtonStyle);
-  }
-
-  public CheckableImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
-    super(context, attrs, defStyleAttr);
-
-    ViewCompat.setAccessibilityDelegate(
-        this,
-        new AccessibilityDelegateCompat() {
-          @Override
-          public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(host, event);
-            event.setChecked(isChecked());
-          }
-
-          @Override
-          public void onInitializeAccessibilityNodeInfo(
-              View host, AccessibilityNodeInfoCompat info) {
-            super.onInitializeAccessibilityNodeInfo(host, info);
-            info.setCheckable(true);
-            info.setChecked(isChecked());
-          }
-        });
-  }
-
-  @Override
-  public void setChecked(boolean checked) {
-    if (mChecked != checked) {
-      mChecked = checked;
-      refreshDrawableState();
-      sendAccessibilityEvent(AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED);
-    }
-  }
-
-  @Override
-  public boolean isChecked() {
-    return mChecked;
-  }
-
-  @Override
-  public void toggle() {
-    setChecked(!mChecked);
-  }
-
-  @Override
-  public int[] onCreateDrawableState(int extraSpace) {
-    if (mChecked) {
-      return mergeDrawableStates(
-          super.onCreateDrawableState(extraSpace + DRAWABLE_STATE_CHECKED.length),
-          DRAWABLE_STATE_CHECKED);
-    } else {
-      return super.onCreateDrawableState(extraSpace);
-    }
-  }
-}
diff --git a/java/com/android/bubble/MoveHandler.java b/java/com/android/bubble/MoveHandler.java
deleted file mode 100644
index 06efbd4..0000000
--- a/java/com/android/bubble/MoveHandler.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * 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.bubble;
-
-import android.content.Context;
-import android.graphics.Point;
-import android.support.animation.FloatPropertyCompat;
-import android.support.animation.SpringAnimation;
-import android.support.animation.SpringForce;
-import android.support.annotation.NonNull;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.View.OnTouchListener;
-import android.view.ViewConfiguration;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.widget.Scroller;
-
-/** Handles touches and manages moving the bubble in response */
-class MoveHandler implements OnTouchListener {
-
-  // Amount the ViewConfiguration's minFlingVelocity will be scaled by for our own minVelocity
-  private static final int MIN_FLING_VELOCITY_FACTOR = 8;
-  // The friction multiplier to control how slippery the bubble is when flung
-  private static final float SCROLL_FRICTION_MULTIPLIER = 4f;
-
-  private final Context context;
-  private final WindowManager windowManager;
-  private final Bubble bubble;
-  private final int minX;
-  private final int minY;
-  private final int maxX;
-  private final int maxY;
-  private final int bubbleSize;
-  private final int shadowPaddingSize;
-  private final float touchSlopSquared;
-
-  private boolean isMoving;
-  private float firstX;
-  private float firstY;
-
-  private SpringAnimation moveXAnimation;
-  private SpringAnimation moveYAnimation;
-  private VelocityTracker velocityTracker;
-  private Scroller scroller;
-
-  private static float clamp(float value, float min, float max) {
-    return Math.min(max, Math.max(min, value));
-  }
-
-  // Handles the left/right gravity conversion and centering
-  private final FloatPropertyCompat<WindowManager.LayoutParams> xProperty =
-      new FloatPropertyCompat<LayoutParams>("xProperty") {
-        @Override
-        public float getValue(LayoutParams windowParams) {
-          int realX = windowParams.x;
-          realX = realX + bubbleSize / 2;
-          realX = realX + shadowPaddingSize;
-          if (relativeToRight(windowParams)) {
-            int displayWidth = context.getResources().getDisplayMetrics().widthPixels;
-            realX = displayWidth - realX;
-          }
-          return clamp(realX, minX, maxX);
-        }
-
-        @Override
-        public void setValue(LayoutParams windowParams, float value) {
-          boolean wasOnRight = (windowParams.gravity & Gravity.RIGHT) == Gravity.RIGHT;
-          int displayWidth = context.getResources().getDisplayMetrics().widthPixels;
-          boolean onRight;
-          Integer gravityOverride = bubble.getGravityOverride();
-          if (gravityOverride == null) {
-            onRight = value > displayWidth / 2;
-          } else {
-            onRight = (gravityOverride & Gravity.RIGHT) == Gravity.RIGHT;
-          }
-          int centeringOffset = bubbleSize / 2 + shadowPaddingSize;
-          windowParams.x =
-              (int) (onRight ? (displayWidth - value - centeringOffset) : value - centeringOffset);
-          windowParams.gravity = Gravity.TOP | (onRight ? Gravity.RIGHT : Gravity.LEFT);
-          if (wasOnRight != onRight) {
-            bubble.onLeftRightSwitch(onRight);
-          }
-          if (bubble.isVisible()) {
-            windowManager.updateViewLayout(bubble.getRootView(), windowParams);
-          }
-        }
-      };
-
-  private final FloatPropertyCompat<WindowManager.LayoutParams> yProperty =
-      new FloatPropertyCompat<LayoutParams>("yProperty") {
-        @Override
-        public float getValue(LayoutParams object) {
-          return clamp(object.y + bubbleSize + shadowPaddingSize, minY, maxY);
-        }
-
-        @Override
-        public void setValue(LayoutParams object, float value) {
-          object.y = (int) value - bubbleSize - shadowPaddingSize;
-          if (bubble.isVisible()) {
-            windowManager.updateViewLayout(bubble.getRootView(), object);
-          }
-        }
-      };
-
-  public MoveHandler(@NonNull View targetView, @NonNull Bubble bubble) {
-    this.bubble = bubble;
-    context = targetView.getContext();
-    windowManager = context.getSystemService(WindowManager.class);
-
-    bubbleSize = context.getResources().getDimensionPixelSize(R.dimen.bubble_size);
-    shadowPaddingSize =
-        context.getResources().getDimensionPixelOffset(R.dimen.bubble_shadow_padding_size);
-    minX =
-        context.getResources().getDimensionPixelOffset(R.dimen.bubble_safe_margin_x)
-            + bubbleSize / 2;
-    minY =
-        context.getResources().getDimensionPixelOffset(R.dimen.bubble_safe_margin_y)
-            + bubbleSize / 2;
-    maxX = context.getResources().getDisplayMetrics().widthPixels - minX;
-    maxY = context.getResources().getDisplayMetrics().heightPixels - minY;
-
-    // Squared because it will be compared against the square of the touch delta. This is more
-    // efficient than needing to take a square root.
-    touchSlopSquared = (float) Math.pow(ViewConfiguration.get(context).getScaledTouchSlop(), 2);
-
-    targetView.setOnTouchListener(this);
-  }
-
-  public boolean isMoving() {
-    return isMoving;
-  }
-
-  public void undoGravityOverride() {
-    LayoutParams windowParams = bubble.getWindowParams();
-    xProperty.setValue(windowParams, xProperty.getValue(windowParams));
-  }
-
-  public void snapToBounds() {
-    ensureSprings();
-
-    moveXAnimation.animateToFinalPosition(relativeToRight(bubble.getWindowParams()) ? maxX : minX);
-    moveYAnimation.animateToFinalPosition(yProperty.getValue(bubble.getWindowParams()));
-  }
-
-  @Override
-  public boolean onTouch(View v, MotionEvent event) {
-    float eventX = event.getRawX();
-    float eventY = event.getRawY();
-    switch (event.getActionMasked()) {
-      case MotionEvent.ACTION_DOWN:
-        firstX = eventX;
-        firstY = eventY;
-        velocityTracker = VelocityTracker.obtain();
-        break;
-      case MotionEvent.ACTION_MOVE:
-        if (isMoving || hasExceededTouchSlop(event)) {
-          if (!isMoving) {
-            isMoving = true;
-            bubble.onMoveStart();
-          }
-
-          ensureSprings();
-
-          moveXAnimation.animateToFinalPosition(clamp(eventX, minX, maxX));
-          moveYAnimation.animateToFinalPosition(clamp(eventY, minY, maxY));
-        }
-
-        velocityTracker.addMovement(event);
-        break;
-      case MotionEvent.ACTION_UP:
-        if (isMoving) {
-          ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
-          velocityTracker.computeCurrentVelocity(
-              1000, viewConfiguration.getScaledMaximumFlingVelocity());
-          float xVelocity = velocityTracker.getXVelocity();
-          float yVelocity = velocityTracker.getYVelocity();
-          boolean isFling = isFling(xVelocity, yVelocity);
-
-          if (isFling) {
-            Point target =
-                findTarget(
-                    xVelocity,
-                    yVelocity,
-                    (int) xProperty.getValue(bubble.getWindowParams()),
-                    (int) yProperty.getValue(bubble.getWindowParams()));
-
-            moveXAnimation.animateToFinalPosition(target.x);
-            moveYAnimation.animateToFinalPosition(target.y);
-          } else {
-            snapX();
-          }
-          isMoving = false;
-          bubble.onMoveFinish();
-        } else {
-          v.performClick();
-          bubble.primaryButtonClick();
-        }
-        break;
-      default: // fall out
-    }
-    return true;
-  }
-
-  private void ensureSprings() {
-    if (moveXAnimation == null) {
-      moveXAnimation = new SpringAnimation(bubble.getWindowParams(), xProperty);
-      moveXAnimation.setSpring(new SpringForce());
-      moveXAnimation.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY);
-    }
-
-    if (moveYAnimation == null) {
-      moveYAnimation = new SpringAnimation(bubble.getWindowParams(), yProperty);
-      moveYAnimation.setSpring(new SpringForce());
-      moveYAnimation.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY);
-    }
-  }
-
-  private Point findTarget(float xVelocity, float yVelocity, int startX, int startY) {
-    if (scroller == null) {
-      scroller = new Scroller(context);
-      scroller.setFriction(ViewConfiguration.getScrollFriction() * SCROLL_FRICTION_MULTIPLIER);
-    }
-
-    // Find where a fling would end vertically
-    scroller.fling(startX, startY, (int) xVelocity, (int) yVelocity, minX, maxX, minY, maxY);
-    int targetY = scroller.getFinalY();
-    scroller.abortAnimation();
-
-    // If the x component of the velocity is above the minimum fling velocity, use velocity to
-    // determine edge. Otherwise use its starting position
-    boolean pullRight = isFling(xVelocity, 0) ? xVelocity > 0 : isOnRightHalf(startX);
-    return new Point(pullRight ? maxX : minX, targetY);
-  }
-
-  private boolean isFling(float xVelocity, float yVelocity) {
-    int minFlingVelocity =
-        ViewConfiguration.get(context).getScaledMinimumFlingVelocity() * MIN_FLING_VELOCITY_FACTOR;
-    return getMagnitudeSquared(xVelocity, yVelocity) > minFlingVelocity * minFlingVelocity;
-  }
-
-  private boolean isOnRightHalf(float currentX) {
-    return currentX > (minX + maxX) / 2;
-  }
-
-  private void snapX() {
-    // Check if x value is closer to min or max
-    boolean pullRight = isOnRightHalf(xProperty.getValue(bubble.getWindowParams()));
-    moveXAnimation.animateToFinalPosition(pullRight ? maxX : minX);
-  }
-
-  private boolean relativeToRight(LayoutParams windowParams) {
-    return (windowParams.gravity & Gravity.RIGHT) == Gravity.RIGHT;
-  }
-
-  private boolean hasExceededTouchSlop(MotionEvent event) {
-    return getMagnitudeSquared(event.getRawX() - firstX, event.getRawY() - firstY)
-        > touchSlopSquared;
-  }
-
-  private float getMagnitudeSquared(float deltaX, float deltaY) {
-    return deltaX * deltaX + deltaY * deltaY;
-  }
-}
diff --git a/java/com/android/bubble/WindowRoot.java b/java/com/android/bubble/WindowRoot.java
deleted file mode 100644
index b9024c4..0000000
--- a/java/com/android/bubble/WindowRoot.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.bubble;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.support.annotation.NonNull;
-import android.view.KeyEvent;
-import android.widget.FrameLayout;
-
-/**
- * ViewGroup that handles some overlay window concerns. Allows back button and configuration change
- * events to be listened for via interfaces.
- */
-public class WindowRoot extends FrameLayout {
-
-  /** Callback for when the back button is pressed while this window is in focus */
-  public interface OnBackPressedListener {
-    boolean onBackPressed();
-  }
-
-  /** Callback for when the Configuration changes for this window */
-  public interface OnConfigurationChangedListener {
-    void onConfigurationChanged(Configuration newConfiguration);
-  }
-
-  private OnBackPressedListener backPressedListener;
-  private OnConfigurationChangedListener configurationChangedListener;
-
-  public WindowRoot(@NonNull Context context) {
-    super(context);
-  }
-
-  public void setOnBackPressedListener(OnBackPressedListener listener) {
-    backPressedListener = listener;
-  }
-
-  public void setOnConfigurationChangedListener(OnConfigurationChangedListener listener) {
-    configurationChangedListener = listener;
-  }
-
-  @Override
-  public boolean dispatchKeyEvent(KeyEvent event) {
-    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && backPressedListener != null) {
-      if (event.getAction() == KeyEvent.ACTION_UP) {
-        return backPressedListener.onBackPressed();
-      }
-      return true;
-    }
-    return super.dispatchKeyEvent(event);
-  }
-
-  @Override
-  public void dispatchConfigurationChanged(Configuration newConfig) {
-    super.dispatchConfigurationChanged(newConfig);
-    if (configurationChangedListener != null) {
-      configurationChangedListener.onConfigurationChanged(newConfig);
-    }
-  }
-}
diff --git a/java/com/android/bubble/res/color/bubble_checkable_mask.xml b/java/com/android/bubble/res/color/bubble_checkable_mask.xml
deleted file mode 100644
index f9416ab..0000000
--- a/java/com/android/bubble/res/color/bubble_checkable_mask.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:color="@android:color/white" android:state_checked="true"/>
-  <item android:color="@android:color/transparent"/>
-</selector>
diff --git a/java/com/android/bubble/res/color/bubble_icon_tint_states.xml b/java/com/android/bubble/res/color/bubble_icon_tint_states.xml
deleted file mode 100644
index 33ca1fd..0000000
--- a/java/com/android/bubble/res/color/bubble_icon_tint_states.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:color="#80FFFFFF" android:state_enabled="false"/>
-  <item android:color="@android:color/white"/>
-</selector>
diff --git a/java/com/android/bubble/res/drawable/bubble_background_pill_ltr.xml b/java/com/android/bubble/res/drawable/bubble_background_pill_ltr.xml
deleted file mode 100644
index 77c813a..0000000
--- a/java/com/android/bubble/res/drawable/bubble_background_pill_ltr.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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
-  -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-  <corners
-      android:bottomRightRadius="@dimen/bubble_size"
-      android:topRightRadius="@dimen/bubble_size"/>
-  <solid android:color="@android:color/white"/>
-</shape>
diff --git a/java/com/android/bubble/res/drawable/bubble_background_pill_rtl.xml b/java/com/android/bubble/res/drawable/bubble_background_pill_rtl.xml
deleted file mode 100644
index 9e25421..0000000
--- a/java/com/android/bubble/res/drawable/bubble_background_pill_rtl.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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
-  -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
-  <corners
-      android:bottomLeftRadius="@dimen/bubble_size"
-      android:topLeftRadius="@dimen/bubble_size"/>
-  <solid android:color="@android:color/white"/>
-</shape>
diff --git a/java/com/android/bubble/res/drawable/bubble_ripple_checkable_circle.xml b/java/com/android/bubble/res/drawable/bubble_ripple_checkable_circle.xml
deleted file mode 100644
index 85e0b24..0000000
--- a/java/com/android/bubble/res/drawable/bubble_ripple_checkable_circle.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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
-  -->
-
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="?android:colorControlHighlight">
-  <item>
-    <shape android:shape="oval">
-      <solid android:color="@color/bubble_checkable_mask"/>
-    </shape>
-  </item>
-  <item android:id="@android:id/mask">
-    <shape android:shape="oval">
-      <solid android:color="@android:color/white"/>
-    </shape>
-  </item>
-</ripple>
diff --git a/java/com/android/bubble/res/drawable/bubble_ripple_circle.xml b/java/com/android/bubble/res/drawable/bubble_ripple_circle.xml
deleted file mode 100644
index 8d5cf0b..0000000
--- a/java/com/android/bubble/res/drawable/bubble_ripple_circle.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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
-  -->
-
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="?android:colorControlHighlight">
-  <item>
-    <shape>
-      <corners android:radius="@dimen/bubble_size"/>
-      <solid android:color="@android:color/white"/>
-    </shape>
-  </item>
-</ripple>
diff --git a/java/com/android/bubble/res/layout/bubble_base.xml b/java/com/android/bubble/res/layout/bubble_base.xml
deleted file mode 100644
index 9f88e70..0000000
--- a/java/com/android/bubble/res/layout/bubble_base.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?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
-  -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:clipToPadding="false"
-    tools:theme="@style/Theme.AppCompat">
-  <View
-      android:id="@+id/bubble_drawer_shadow_provider"
-      android:layout_width="@dimen/bubble_size"
-      android:layout_height="@dimen/bubble_size"
-      android:layout_marginTop="@dimen/bubble_shadow_padding_size"
-      android:layout_marginBottom="@dimen/bubble_shadow_padding_size"
-      android:layout_marginStart="@dimen/bubble_shadow_padding_size"
-      android:background="@drawable/bubble_ripple_circle"
-      android:backgroundTint="@android:color/transparent"
-      android:elevation="10dp"
-      android:visibility="invisible"
-      />
-  <View
-      android:id="@+id/bubble_drawer_shadow_provider_rtl"
-      android:layout_width="@dimen/bubble_size"
-      android:layout_height="@dimen/bubble_size"
-      android:layout_marginTop="@dimen/bubble_shadow_padding_size"
-      android:layout_marginBottom="@dimen/bubble_shadow_padding_size"
-      android:layout_marginRight="@dimen/bubble_shadow_padding_size"
-      android:layout_gravity="right"
-      android:background="@drawable/bubble_ripple_circle"
-      android:backgroundTint="@android:color/transparent"
-      android:elevation="10dp"
-      android:visibility="invisible"
-      />
-  <FrameLayout
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_marginStart="@dimen/bubble_drawer_margin"
-      android:elevation="10dp"
-      android:paddingTop="@dimen/bubble_shadow_padding_size"
-      android:paddingBottom="@dimen/bubble_shadow_padding_size"
-      android:paddingEnd="@dimen/bubble_shadow_padding_size">
-
-    <LinearLayout
-        android:id="@+id/bubble_expanded_layout"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        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"
-        android:visibility="gone"
-        tools:backgroundTint="#FF0000FF"
-        tools:visibility="visible">
-      <com.android.bubble.CheckableImageButton
-          android:id="@+id/bubble_icon_first"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:layout_marginStart="4dp"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@color/bubble_icon_tint_states"
-          android:tintMode="src_in"
-          tools:background="@drawable/bubble_ripple_checkable_circle"
-          tools:src="@android:drawable/ic_lock_idle_lock"/>
-      <com.android.bubble.CheckableImageButton
-          android:id="@+id/bubble_icon_second"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:layout_marginStart="4dp"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@color/bubble_icon_tint_states"
-          android:tintMode="src_in"
-          tools:background="@drawable/bubble_ripple_checkable_circle"
-          tools:src="@android:drawable/ic_input_add"/>
-      <com.android.bubble.CheckableImageButton
-          android:id="@+id/bubble_icon_third"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:layout_marginStart="4dp"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@color/bubble_icon_tint_states"
-          android:tintMode="src_in"
-          tools:background="@drawable/bubble_ripple_checkable_circle"
-          tools:src="@android:drawable/ic_menu_call"/>
-    </LinearLayout>
-  </FrameLayout>
-  <FrameLayout
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_marginRight="@dimen/bubble_drawer_margin"
-      android:elevation="10dp"
-      android:paddingTop="@dimen/bubble_shadow_padding_size"
-      android:paddingBottom="@dimen/bubble_shadow_padding_size"
-      android:paddingLeft="@dimen/bubble_shadow_padding_size">
-    <LinearLayout
-        android:id="@+id/bubble_expanded_layout_rtl"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        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"
-        android:visibility="gone"
-        tools:backgroundTint="#FF0000FF"
-        tools:visibility="invisible">
-      <com.android.bubble.CheckableImageButton
-          android:id="@+id/bubble_icon_first_rtl"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:layout_marginRight="4dp"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@color/bubble_icon_tint_states"
-          android:tintMode="src_in"
-          tools:background="@drawable/bubble_ripple_checkable_circle"
-          tools:src="@android:drawable/ic_lock_idle_lock"/>
-      <com.android.bubble.CheckableImageButton
-          android:id="@+id/bubble_icon_second_rtl"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:layout_marginRight="4dp"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@color/bubble_icon_tint_states"
-          android:tintMode="src_in"
-          tools:background="@drawable/bubble_ripple_checkable_circle"
-          tools:src="@android:drawable/ic_input_add"/>
-      <com.android.bubble.CheckableImageButton
-          android:id="@+id/bubble_icon_third_rtl"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:layout_marginRight="4dp"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@color/bubble_icon_tint_states"
-          android:tintMode="src_in"
-          tools:background="@drawable/bubble_ripple_checkable_circle"
-          tools:src="@android:drawable/ic_menu_call"/>
-    </LinearLayout>
-  </FrameLayout>
-  <FrameLayout
-      android:id="@+id/bubble_primary_container"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_gravity="start"
-      android:animateLayoutChanges="true"
-      android:clipChildren="false"
-      android:clipToPadding="false"
-      android:elevation="12dp">
-    <ViewAnimator
-        android:id="@+id/bubble_button_primary"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_margin="@dimen/bubble_shadow_padding_size"
-        android:background="@drawable/bubble_ripple_circle"
-        android:measureAllChildren="false"
-        tools:backgroundTint="#FF0000AA">
-      <ImageView
-          android:id="@+id/bubble_icon_primary"
-          android:layout_width="@dimen/bubble_size"
-          android:layout_height="@dimen/bubble_size"
-          android:padding="@dimen/bubble_icon_padding"
-          android:tint="@android:color/white"
-          android:tintMode="src_in"
-          tools:src="@android:drawable/ic_btn_speak_now"/>
-      <TextView
-          android:id="@+id/bubble_text"
-          android:layout_width="wrap_content"
-          android:layout_height="@dimen/bubble_size"
-          android:paddingStart="@dimen/bubble_icon_padding"
-          android:paddingEnd="@dimen/bubble_icon_padding"
-          android:gravity="center"
-          android:minWidth="@dimen/bubble_size"
-          android:textAppearance="@style/TextAppearance.AppCompat"
-          tools:text="Call ended"/>
-    </ViewAnimator>
-  </FrameLayout>
-
-</FrameLayout>
diff --git a/java/com/android/bubble/res/values-car/values.xml b/java/com/android/bubble/res/values-car/values.xml
deleted file mode 100644
index 47f20a1..0000000
--- a/java/com/android/bubble/res/values-car/values.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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">50dp</dimen>
-    <dimen name="bubble_drawer_padding_start">38dp</dimen>
-    <dimen name="bubble_drawer_padding_end">12dp</dimen>
-</resources>
-
diff --git a/java/com/android/bubble/res/values/colors.xml b/java/com/android/bubble/res/values/colors.xml
deleted file mode 100644
index 97545fa..0000000
--- a/java/com/android/bubble/res/values/colors.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?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>
-  <color name="bubble_primary_background_darken">#33000000</color>
-</resources>
diff --git a/java/com/android/bubble/res/values/values.xml b/java/com/android/bubble/res/values/values.xml
deleted file mode 100644
index 6066e18..0000000
--- a/java/com/android/bubble/res/values/values.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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_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/incallui/AndroidManifest.xml b/java/com/android/incallui/AndroidManifest.xml
index 3d5aa1c..eb080bc 100644
--- a/java/com/android/incallui/AndroidManifest.xml
+++ b/java/com/android/incallui/AndroidManifest.xml
@@ -114,9 +114,6 @@
 
     <receiver
         android:exported="false"
-        android:name=".ReturnToCallActionReceiver"/>
-    <receiver
-        android:exported="false"
         android:name=".NewReturnToCallActionReceiver"/>
 
   </application>
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 535b894..8769be5 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -60,7 +60,6 @@
 import com.android.dialer.compat.ActivityCompat;
 import com.android.dialer.compat.CompatUtils;
 import com.android.dialer.configprovider.ConfigProviderBindings;
-import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.LoggingBindings;
 import com.android.dialer.logging.ScreenEvent;
@@ -173,11 +172,6 @@
     Trace.beginSection("InCallActivity.onCreate");
     super.onCreate(bundle);
 
-    if (getIntent().getBooleanExtra(ReturnToCallController.RETURN_TO_CALL_EXTRA_KEY, false)) {
-      Logger.get(this).logImpression(DialerImpression.Type.BUBBLE_PRIMARY_BUTTON_RETURN_TO_CALL);
-      getIntent().removeExtra(ReturnToCallController.RETURN_TO_CALL_EXTRA_KEY);
-    }
-
     if (bundle != null) {
       didShowAnswerScreen = bundle.getBoolean(KeysForSavedInstance.DID_SHOW_ANSWER_SCREEN);
       didShowInCallScreen = bundle.getBoolean(KeysForSavedInstance.DID_SHOW_IN_CALL_SCREEN);
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java
index c4d6d06..a7095f8 100644
--- a/java/com/android/incallui/InCallServiceImpl.java
+++ b/java/com/android/incallui/InCallServiceImpl.java
@@ -40,7 +40,6 @@
  */
 public class InCallServiceImpl extends InCallService {
 
-  private ReturnToCallController returnToCallController;
   private NewReturnToCallController newReturnToCallController;
   private CallList.Listener feedbackListener;
   // We only expect there to be one speakEasyCallManager to be instantiated at a time.
@@ -112,9 +111,6 @@
     InCallPresenter.getInstance().onServiceBind();
     InCallPresenter.getInstance().maybeStartRevealAnimation(intent);
     TelecomAdapter.getInstance().setInCallService(this);
-    if (ReturnToCallController.isEnabled(this)) {
-      returnToCallController = new ReturnToCallController(this);
-    }
     if (NewReturnToCallController.isEnabled(this)) {
       newReturnToCallController =
           new NewReturnToCallController(this, ContactInfoCache.getInstance(context));
@@ -145,10 +141,6 @@
     // Tear down the InCall system
     InCallPresenter.getInstance().tearDown();
     TelecomAdapter.getInstance().clearInCallService();
-    if (returnToCallController != null) {
-      returnToCallController.tearDown();
-      returnToCallController = null;
-    }
     if (newReturnToCallController != null) {
       newReturnToCallController.tearDown();
       newReturnToCallController = null;
diff --git a/java/com/android/incallui/ReturnToCallActionReceiver.java b/java/com/android/incallui/ReturnToCallActionReceiver.java
deleted file mode 100644
index c37b0b8..0000000
--- a/java/com/android/incallui/ReturnToCallActionReceiver.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * 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 ReturnToCallActionReceiver extends BroadcastReceiver {
-
-  public static final String ACTION_TOGGLE_SPEAKER = "toggleSpeaker";
-  public static final String ACTION_SHOW_AUDIO_ROUTE_SELECTOR = "showAudioRouteSelector";
-  public static final String ACTION_TOGGLE_MUTE = "toggleMute";
-  public static final String ACTION_END_CALL = "endCall";
-
-  @Override
-  public void onReceive(Context context, Intent intent) {
-    switch (intent.getAction()) {
-      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 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_TURN_ON_WIRED_OR_EARPIECE,
-              call != null ? call.getUniqueCallId() : "",
-              call != null ? call.getTimeAddedMs() : 0);
-    } else {
-      newRoute = CallAudioState.ROUTE_SPEAKER;
-      Logger.get(context)
-          .logCallImpression(
-              DialerImpression.Type.BUBBLE_TURN_ON_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);
-    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_MUTE_CALL
-                : DialerImpression.Type.BUBBLE_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_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/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
deleted file mode 100644
index 58d8688..0000000
--- a/java/com/android/incallui/ReturnToCallController.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * 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.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.Icon;
-import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
-import android.telecom.CallAudioState;
-import com.android.bubble.Bubble;
-import com.android.bubble.Bubble.BubbleExpansionStateListener;
-import com.android.bubble.Bubble.ExpansionState;
-import com.android.bubble.BubbleInfo;
-import com.android.bubble.BubbleInfo.Action;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.configprovider.ConfigProviderBindings;
-import com.android.dialer.logging.DialerImpression;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.telecom.TelecomUtil;
-import com.android.incallui.InCallPresenter.InCallUiListener;
-import com.android.incallui.audiomode.AudioModeProvider;
-import com.android.incallui.audiomode.AudioModeProvider.AudioModeListener;
-import com.android.incallui.call.CallList;
-import com.android.incallui.call.CallList.Listener;
-import com.android.incallui.call.DialerCall;
-import com.android.incallui.speakerbuttonlogic.SpeakerButtonInfo;
-import com.android.incallui.speakerbuttonlogic.SpeakerButtonInfo.IconSize;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Listens for events relevant to the return-to-call bubble and updates the bubble's state as
- * necessary
- */
-public class ReturnToCallController 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)
-  Bubble bubble;
-
-  private CallAudioState audioState;
-
-  private final PendingIntent toggleSpeaker;
-  private final PendingIntent showSpeakerSelect;
-  private final PendingIntent toggleMute;
-  private final PendingIntent endCall;
-
-  public static boolean isEnabled(Context context) {
-    return ConfigProviderBindings.get(context).getBoolean("enable_return_to_call_bubble", false);
-  }
-
-  public ReturnToCallController(Context context) {
-    this.context = context;
-
-    toggleSpeaker = createActionIntent(ReturnToCallActionReceiver.ACTION_TOGGLE_SPEAKER);
-    showSpeakerSelect =
-        createActionIntent(ReturnToCallActionReceiver.ACTION_SHOW_AUDIO_ROUTE_SELECTOR);
-    toggleMute = createActionIntent(ReturnToCallActionReceiver.ACTION_TOGGLE_MUTE);
-    endCall = createActionIntent(ReturnToCallActionReceiver.ACTION_END_CALL);
-
-    InCallPresenter.getInstance().addInCallUiListener(this);
-    CallList.getInstance().addListener(this);
-    AudioModeProvider.getInstance().addListener(this);
-    audioState = AudioModeProvider.getInstance().getAudioState();
-  }
-
-  public void tearDown() {
-    hide();
-    InCallPresenter.getInstance().removeInCallUiListener(this);
-    CallList.getInstance().removeListener(this);
-    AudioModeProvider.getInstance().removeListener(this);
-  }
-
-  @Override
-  public void onUiShowing(boolean showing) {
-    if (showing) {
-      hide();
-    } else {
-      if (TelecomUtil.isInManagedCall(context)) {
-        show();
-      }
-    }
-  }
-
-  private void hide() {
-    if (bubble != null) {
-      bubble.hide();
-    } else {
-      LogUtil.i("ReturnToCallController.hide", "hide() called without calling show()");
-    }
-  }
-
-  private void hideAndReset() {
-    if (bubble != null) {
-      bubble.hideAndReset();
-    } else {
-      LogUtil.i("ReturnToCallController.reset", "reset() called without calling show()");
-    }
-  }
-
-  private void show() {
-    if (bubble == null) {
-      bubble = startNewBubble();
-    } else {
-      bubble.show();
-    }
-  }
-
-  @VisibleForTesting
-  public Bubble startNewBubble() {
-    if (!Bubble.canShowBubbles(context)) {
-      LogUtil.i("ReturnToCallController.startNewBubble", "can't show bubble, no permission");
-      return null;
-    }
-    Bubble returnToCallBubble = Bubble.createBubble(context, generateBubbleInfo());
-    returnToCallBubble.setBubbleExpansionStateListener(
-        new BubbleExpansionStateListener() {
-          @Override
-          public void onBubbleExpansionStateChanged(
-              @ExpansionState int expansionState, boolean isUserAction) {
-            if (!isUserAction) {
-              return;
-            }
-
-            DialerCall call = CallList.getInstance().getActiveOrBackgroundCall();
-            switch (expansionState) {
-              case ExpansionState.START_EXPANDING:
-                if (call != null) {
-                  Logger.get(context)
-                      .logCallImpression(
-                          DialerImpression.Type.BUBBLE_PRIMARY_BUTTON_EXPAND,
-                          call.getUniqueCallId(),
-                          call.getTimeAddedMs());
-                } else {
-                  Logger.get(context)
-                      .logImpression(DialerImpression.Type.BUBBLE_PRIMARY_BUTTON_EXPAND);
-                }
-                break;
-              case ExpansionState.START_COLLAPSING:
-                if (call != null) {
-                  Logger.get(context)
-                      .logCallImpression(
-                          DialerImpression.Type.BUBBLE_COLLAPSE_BY_USER,
-                          call.getUniqueCallId(),
-                          call.getTimeAddedMs());
-                } else {
-                  Logger.get(context).logImpression(DialerImpression.Type.BUBBLE_COLLAPSE_BY_USER);
-                }
-                break;
-              default:
-                break;
-            }
-          }
-        });
-    returnToCallBubble.show();
-    return returnToCallBubble;
-  }
-
-  @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 onDisconnect(DialerCall call) {
-    if (call.wasParentCall()) {
-      // It's disconnected after the last child call is disconnected, and we already did everything
-      // for the last child.
-      LogUtil.i(
-          "ReturnToCallController.onDisconnect", "being called for a parent call and do nothing");
-      return;
-    }
-    if (bubble != null
-        && bubble.isVisible()
-        && (!TelecomUtil.isInManagedCall(context)
-            || CallList.getInstance().getActiveOrBackgroundCall() != null)) {
-      bubble.showText(context.getText(R.string.incall_call_ended));
-    }
-    // For conference call, we should hideAndReset for the last disconnected child call while the
-    // parent call is still there.
-    if (!CallList.getInstance().hasNonParentActiveOrBackgroundCall()) {
-      hideAndReset();
-    }
-  }
-
-  @Override
-  public void onWiFiToLteHandover(DialerCall call) {}
-
-  @Override
-  public void onHandoverToWifiFailed(DialerCall call) {}
-
-  @Override
-  public void onInternationalCallOnWifi(@NonNull DialerCall call) {}
-
-  @Override
-  public void onAudioStateChanged(CallAudioState audioState) {
-    this.audioState = audioState;
-    if (bubble != null) {
-      bubble.updateActions(generateActions());
-    }
-  }
-
-  private BubbleInfo generateBubbleInfo() {
-    Intent activityIntent = InCallActivity.getIntent(context, false, false, false);
-    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-    activityIntent.putExtra(RETURN_TO_CALL_EXTRA_KEY, true);
-    return BubbleInfo.builder()
-        .setPrimaryColor(context.getResources().getColor(R.color.dialer_theme_color, null))
-        .setPrimaryIcon(Icon.createWithResource(context, R.drawable.on_going_call))
-        .setStartingYPosition(
-            context.getResources().getDimensionPixelOffset(R.dimen.return_to_call_initial_offset_y))
-        .setPrimaryIntent(
-            PendingIntent.getActivity(
-                context, InCallActivity.PendingIntentRequestCodes.BUBBLE, activityIntent, 0))
-        .setActions(generateActions())
-        .build();
-  }
-
-  @NonNull
-  private List<Action> generateActions() {
-    List<Action> actions = new ArrayList<>();
-    SpeakerButtonInfo speakerButtonInfo = new SpeakerButtonInfo(audioState, IconSize.SIZE_24_DP);
-
-    actions.add(
-        Action.builder()
-            .setIcon(Icon.createWithResource(context, speakerButtonInfo.icon))
-            .setName(context.getText(speakerButtonInfo.label))
-            .setChecked(speakerButtonInfo.isChecked)
-            .setIntent(speakerButtonInfo.checkable ? toggleSpeaker : showSpeakerSelect)
-            .build());
-
-    actions.add(
-        Action.builder()
-            .setIcon(Icon.createWithResource(context, R.drawable.quantum_ic_mic_off_white_24))
-            .setName(context.getText(R.string.incall_label_mute))
-            .setChecked(audioState.isMuted())
-            .setIntent(toggleMute)
-            .build());
-    actions.add(
-        Action.builder()
-            .setIcon(Icon.createWithResource(context, R.drawable.quantum_ic_call_end_vd_theme_24))
-            .setName(context.getText(R.string.incall_label_end_call))
-            .setIntent(endCall)
-            .build());
-    return actions;
-  }
-
-  @NonNull
-  private PendingIntent createActionIntent(String action) {
-    Intent toggleSpeaker = new Intent(context, ReturnToCallActionReceiver.class);
-    toggleSpeaker.setAction(action);
-    return PendingIntent.getBroadcast(context, 0, toggleSpeaker, 0);
-  }
-}
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 960fd14..87f332a 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -657,8 +657,8 @@
     } else if (call.hasProperty(Details.PROPERTY_HAS_CDMA_VOICE_PRIVACY)) {
       return R.drawable.quantum_ic_phone_locked_vd_theme_24;
     }
-    // If ReturnToCall is enabled, use the static icon. The animated one will show in the bubble.
-    if (ReturnToCallController.isEnabled(context) || NewReturnToCallController.isEnabled(context)) {
+    // If NewReturnToCall is enabled, use the static icon. The animated one will show in the bubble.
+    if (NewReturnToCallController.isEnabled(context)) {
       return R.drawable.quantum_ic_call_vd_theme_24;
     } else {
       return R.drawable.on_going_call;