Merge changes If4000f63,If49a357a,I9b5d8d87,I9ea7fb67

* changes:
  Fix search bar margin issue in RTL
  Prevent crash when dialpad animation ends after activity is saved.
  Fixed some issues in dialer's dialpad for talkback users.
  Voicemail and Call log notifications now open GoogleMainActivity.
diff --git a/java/com/android/dialer/app/MainComponent.java b/java/com/android/dialer/app/MainComponent.java
index c223723..ec3fc3f 100644
--- a/java/com/android/dialer/app/MainComponent.java
+++ b/java/com/android/dialer/app/MainComponent.java
@@ -56,6 +56,6 @@
   }
 
   private static String getComponentName() {
-    return "com.android.dialer.main.impl.MainActivity";
+    return "com.android.dialer.app.DialtactsActivity";
   }
 }
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 6f8d677..9d88d8e 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -1050,9 +1050,15 @@
       digits.clear();
       return true;
     } else if (id == R.id.one) {
-      if (isDigitsEmpty() || TextUtils.equals(this.digits.getText(), "1")) {
+      // For non-talkback users: check for empty
+      // For linear navigation users: check for "1"
+      // For explore by touch users: check for "11"
+      if (isDigitsEmpty()
+          || TextUtils.equals(this.digits.getText(), "1")
+          || TextUtils.equals(this.digits.getText(), "11")) {
         // We'll try to initiate voicemail and thus we want to remove irrelevant string.
         removePreviousDigitIfPossible('1');
+        removePreviousDigitIfPossible('1');
 
         List<PhoneAccountHandle> subscriptionAccountHandles =
             TelecomUtil.getSubscriptionPhoneAccounts(getActivity());
@@ -1094,6 +1100,7 @@
         // (and not via other means like certain accessibility input methods).
         // Remove the '0' that was input when the key was first pressed.
         removePreviousDigitIfPossible('0');
+        removePreviousDigitIfPossible('0');
       }
       keyPressed(KeyEvent.KEYCODE_PLUS);
       stopTone();
diff --git a/java/com/android/dialer/dialpadview/DialpadKeyButton.java b/java/com/android/dialer/dialpadview/DialpadKeyButton.java
index 84aca14..47553b6 100644
--- a/java/com/android/dialer/dialpadview/DialpadKeyButton.java
+++ b/java/com/android/dialer/dialpadview/DialpadKeyButton.java
@@ -19,13 +19,14 @@
 import android.content.Context;
 import android.graphics.RectF;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewConfiguration;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 import android.widget.FrameLayout;
 
 /**
@@ -45,33 +46,21 @@
  */
 public class DialpadKeyButton extends FrameLayout {
 
-  /** Timeout before switching to long-click accessibility mode. */
-  private static final int LONG_HOVER_TIMEOUT = ViewConfiguration.getLongPressTimeout() * 2;
-
   /** Accessibility manager instance used to check touch exploration state. */
   private AccessibilityManager accessibilityManager;
 
   /** Bounds used to filter HOVER_EXIT events. */
   private RectF hoverBounds = new RectF();
 
-  /** Whether this view is currently in the long-hover state. */
-  private boolean longHovered;
-
   /** Alternate content description for long-hover state. */
   private CharSequence longHoverContentDesc;
 
-  /** Backup of standard content description. Used for accessibility. */
-  private CharSequence backupContentDesc;
-
   /** Backup of clickable property. Used for accessibility. */
   private boolean wasClickable;
 
   /** Backup of long-clickable property. Used for accessibility. */
   private boolean wasLongClickable;
 
-  /** Runnable used to trigger long-click mode for accessibility. */
-  private Runnable longHoverRunnable;
-
   private OnPressedListener onPressedListener;
 
   public DialpadKeyButton(Context context, AttributeSet attrs) {
@@ -95,19 +84,6 @@
 
   public void setLongHoverContentDescription(CharSequence contentDescription) {
     longHoverContentDesc = contentDescription;
-
-    if (longHovered) {
-      super.setContentDescription(longHoverContentDesc);
-    }
-  }
-
-  @Override
-  public void setContentDescription(CharSequence contentDescription) {
-    if (longHovered) {
-      backupContentDesc = contentDescription;
-    } else {
-      super.setContentDescription(contentDescription);
-    }
   }
 
   @Override
@@ -139,6 +115,18 @@
   }
 
   @Override
+  public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+    super.onInitializeAccessibilityNodeInfo(info);
+    // If the button has a long hover description, ask talkback to announce the action follow by
+    // the description (for example "double tap and hold to call voicemail").
+    if (!TextUtils.isEmpty(longHoverContentDesc)) {
+      AccessibilityAction longClickAction =
+          new AccessibilityAction(AccessibilityNodeInfo.ACTION_LONG_CLICK, longHoverContentDesc);
+      info.addAction(longClickAction);
+    }
+  }
+
+  @Override
   public boolean onHoverEvent(MotionEvent event) {
     // When touch exploration is turned on, lifting a finger while inside
     // the button's hover target bounds should perform a click action.
@@ -148,20 +136,6 @@
           // Lift-to-type temporarily disables double-tap activation.
           wasClickable = isClickable();
           wasLongClickable = isLongClickable();
-          if (wasLongClickable && longHoverContentDesc != null) {
-            if (longHoverRunnable == null) {
-              longHoverRunnable =
-                  new Runnable() {
-                    @Override
-                    public void run() {
-                      setLongHovered(true);
-                      announceForAccessibility(longHoverContentDesc);
-                    }
-                  };
-            }
-            postDelayed(longHoverRunnable, LONG_HOVER_TIMEOUT);
-          }
-
           setClickable(false);
           setLongClickable(false);
           break;
@@ -170,7 +144,6 @@
             simulateClickForAccessibility();
           }
 
-          cancelLongHover();
           setClickable(wasClickable);
           setLongClickable(wasLongClickable);
           break;
@@ -201,27 +174,6 @@
     setPressed(false);
   }
 
-  private void setLongHovered(boolean enabled) {
-    if (longHovered != enabled) {
-      longHovered = enabled;
-
-      // Switch between normal and alternate description, if available.
-      if (enabled) {
-        backupContentDesc = getContentDescription();
-        super.setContentDescription(longHoverContentDesc);
-      } else {
-        super.setContentDescription(backupContentDesc);
-      }
-    }
-  }
-
-  private void cancelLongHover() {
-    if (longHoverRunnable != null) {
-      removeCallbacks(longHoverRunnable);
-    }
-    setLongHovered(false);
-  }
-
   public interface OnPressedListener {
 
     void onPressed(View view, boolean pressed);
diff --git a/java/com/android/dialer/dialpadview/DialpadView.java b/java/com/android/dialer/dialpadview/DialpadView.java
index 0369b40..6d538f3 100644
--- a/java/com/android/dialer/dialpadview/DialpadView.java
+++ b/java/com/android/dialer/dialpadview/DialpadView.java
@@ -171,6 +171,9 @@
       } else if (BUTTON_IDS[i] == R.id.star) {
         numberString = resources.getString(R.string.dialpad_star_number);
         numberContentDescription = numberString;
+      } else if (BUTTON_IDS[i] == R.id.zero) {
+        numberString = numberFormat.format(i);
+        numberContentDescription = numberString;
       } else {
         numberString = numberFormat.format(i);
         // The content description is used for Talkback key presses. The number is
diff --git a/java/com/android/dialer/dialpadview/res/values/strings.xml b/java/com/android/dialer/dialpadview/res/values/strings.xml
index 5d8d8e6..eb5c04f 100644
--- a/java/com/android/dialer/dialpadview/res/values/strings.xml
+++ b/java/com/android/dialer/dialpadview/res/values/strings.xml
@@ -30,12 +30,12 @@
   <string name="description_delete_button">backspace</string>
 
   <!--  String describing the button used to add a plus (+) symbol to the dialpad -->
-  <string name="description_image_button_plus">plus</string>
+  <string name="description_image_button_plus">dial plus</string>
 
   <!-- String describing the Voicemail ImageButton.
        Used by AccessibilityService to announce the purpose of the button.
   -->
-  <string name="description_voicemail_button">voicemail</string>
+  <string name="description_voicemail_button">call voicemail</string>
 
   <!-- String describing the Dial ImageButton
 
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 2279d56..b04e7b1 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -50,6 +50,7 @@
 import com.android.dialer.searchfragment.list.NewSearchFragment;
 import com.android.dialer.searchfragment.list.NewSearchFragment.SearchFragmentListener;
 import com.android.dialer.smartdial.util.SmartDialNameMatcher;
+import com.android.dialer.util.TransactionSafeActivity;
 import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
@@ -78,7 +79,7 @@
   private static final String DIALPAD_FRAGMENT_TAG = "dialpad_fragment_tag";
   private static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag";
 
-  private final AppCompatActivity activity;
+  private final TransactionSafeActivity activity;
   private final BottomNavBar bottomNav;
   private final FloatingActionButton fab;
   private final MainToolbar toolbar;
@@ -97,7 +98,7 @@
   private boolean requestingPermission;
 
   public MainSearchController(
-      AppCompatActivity activity,
+      TransactionSafeActivity activity,
       BottomNavBar bottomNav,
       FloatingActionButton fab,
       MainToolbar toolbar,
@@ -201,7 +202,8 @@
 
           @Override
           public void onAnimationEnd(Animation animation) {
-            if (!(activity.isFinishing() || activity.isDestroyed())) {
+            if (activity.isSafeToCommitTransactions()
+                && !(activity.isFinishing() || activity.isDestroyed())) {
               activity.getFragmentManager().beginTransaction().hide(dialpadFragment).commit();
             }
           }
diff --git a/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml b/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml
index c7c37d0..d63fdfe 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml
@@ -19,116 +19,119 @@
     android:layout_width="match_parent"
     android:layout_height="@dimen/expanded_search_bar_height"
     android:background="@color/dialer_theme_color"
-    app:contentInsetStart="0dp"
-    app:contentInsetEnd="0dp">
-
-  <com.android.dialer.main.impl.toolbar.SearchBarView
-      android:id="@+id/search_view_container"
+    app:contentInsetEnd="0dp"
+    app:contentInsetStart="0dp">
+  <FrameLayout
       android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_margin="@dimen/search_bar_margin"
-      android:minHeight="@dimen/collapsed_search_bar_height"
-      android:background="@drawable/search_bar_background_rounded_corners"
-      android:elevation="4dp">
+      android:layout_height="match_parent">
+    <com.android.dialer.main.impl.toolbar.SearchBarView
+        android:id="@+id/search_view_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/search_bar_margin"
+        android:background="@drawable/search_bar_background_rounded_corners"
+        android:elevation="4dp"
+        android:minHeight="@dimen/collapsed_search_bar_height">
 
-    <RelativeLayout
-      android:id="@+id/search_box_collapsed"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_gravity="center_vertical"
-      android:background="?android:selectableItemBackground"
-      android:gravity="center_vertical">
-
-      <ImageView
-          android:id="@+id/search_magnifying_glass"
-          android:layout_width="48dp"
-          android:layout_height="48dp"
-          android:layout_marginStart="8dp"
-          android:layout_centerVertical="true"
-          android:importantForAccessibility="no"
-          android:scaleType="center"
-          android:src="@drawable/quantum_ic_search_vd_theme_24"
-          android:tint="@color/dialer_secondary_text_color"/>
-
-      <TextView
-          android:id="@+id/search_box_start_search"
-          android:layout_width="wrap_content"
+      <RelativeLayout
+          android:id="@+id/search_box_collapsed"
+          android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:layout_toEndOf="@+id/search_magnifying_glass"
-          android:layout_toStartOf="@+id/voice_search_button"
-          android:layout_marginStart="8dp"
-          android:layout_centerVertical="true"
-          android:fontFamily="sans-serif"
-          android:text="@string/dialer_hint_find_contact"
-          android:textColor="@color/dialer_secondary_text_color"
-          android:textSize="16dp"/>
+          android:layout_gravity="center_vertical"
+          android:background="?android:selectableItemBackground"
+          android:gravity="center_vertical">
 
-      <ImageView
-          android:id="@+id/voice_search_button"
-          android:layout_width="48dp"
-          android:layout_height="48dp"
-          android:layout_toStartOf="@+id/main_options_menu_button"
-          android:background="?android:attr/selectableItemBackgroundBorderless"
-          android:contentDescription="@string/description_start_voice_search"
-          android:scaleType="center"
-          android:src="@drawable/quantum_ic_mic_vd_theme_24"
-          android:tint="@color/dialer_secondary_text_color"/>
+        <ImageView
+            android:id="@+id/search_magnifying_glass"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:layout_marginStart="8dp"
+            android:layout_centerVertical="true"
+            android:importantForAccessibility="no"
+            android:scaleType="center"
+            android:src="@drawable/quantum_ic_search_vd_theme_24"
+            android:tint="@color/dialer_secondary_text_color"/>
 
-      <ImageButton
-          android:id="@+id/main_options_menu_button"
-          android:layout_width="48dp"
-          android:layout_height="48dp"
-          android:layout_alignParentEnd="true"
-          android:background="?android:attr/selectableItemBackgroundBorderless"
-          android:contentDescription="@string/action_menu_overflow_description"
-          android:scaleType="center"
-          android:src="@drawable/quantum_ic_more_vert_vd_theme_24"
-          android:tint="@color/dialer_secondary_text_color"/>
-    </RelativeLayout>
+        <TextView
+            android:id="@+id/search_box_start_search"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="8dp"
+            android:layout_centerVertical="true"
+            android:layout_toEndOf="@+id/search_magnifying_glass"
+            android:layout_toStartOf="@+id/voice_search_button"
+            android:fontFamily="sans-serif"
+            android:text="@string/dialer_hint_find_contact"
+            android:textColor="@color/dialer_secondary_text_color"
+            android:textSize="16dp"/>
 
-    <include layout="@layout/expanded_search_bar"/>
-  </com.android.dialer.main.impl.toolbar.SearchBarView>
+        <ImageView
+            android:id="@+id/voice_search_button"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:layout_toStartOf="@+id/main_options_menu_button"
+            android:background="?android:attr/selectableItemBackgroundBorderless"
+            android:contentDescription="@string/description_start_voice_search"
+            android:scaleType="center"
+            android:src="@drawable/quantum_ic_mic_vd_theme_24"
+            android:tint="@color/dialer_secondary_text_color"/>
 
-  <!-- Sets android:importantForAccessibility="no" to avoid being announced when navigating with
-       talkback enabled. It will still be announced when user drag or drop contact onto it.
-       This is required since drag and drop event is only sent to views are visible when drag
-       starts. -->
-  <com.android.dialer.app.list.RemoveView
-      android:id="@+id/remove_view"
-      android:layout_width="match_parent"
-      android:layout_height="match_parent"
-      android:layout_gravity="center_vertical"
-      android:layout_margin="@dimen/search_bar_margin"
-      android:contentDescription="@string/main_remove_contact"
-      android:importantForAccessibility="no">
+        <ImageButton
+            android:id="@+id/main_options_menu_button"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:layout_alignParentEnd="true"
+            android:background="?android:attr/selectableItemBackgroundBorderless"
+            android:contentDescription="@string/action_menu_overflow_description"
+            android:scaleType="center"
+            android:src="@drawable/quantum_ic_more_vert_vd_theme_24"
+            android:tint="@color/dialer_secondary_text_color"/>
+      </RelativeLayout>
 
-    <!-- We set this view's visibility to gone instead of the parent because if we hide remove
-    view, it won't receive drag and accessibility events. -->
-    <LinearLayout
-        android:id="@+id/remove_view_content"
+      <include layout="@layout/expanded_search_bar"/>
+    </com.android.dialer.main.impl.toolbar.SearchBarView>
+
+    <!-- Sets android:importantForAccessibility="no" to avoid being announced when navigating with
+         talkback enabled. It will still be announced when user drag or drop contact onto it.
+         This is required since drag and drop event is only sent to views are visible when drag
+         starts. -->
+    <com.android.dialer.app.list.RemoveView
+        android:id="@+id/remove_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@color/dialer_theme_color"
-        android:gravity="center"
-        android:orientation="horizontal"
-        android:visibility="gone">
+        android:layout_margin="@dimen/search_bar_margin"
+        android:layout_gravity="center_vertical"
+        android:contentDescription="@string/main_remove_contact"
+        android:importantForAccessibility="no">
 
-      <ImageView
-          android:id="@+id/remove_view_icon"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_marginTop="8dp"
-          android:layout_marginBottom="8dp"
-          android:src="@drawable/quantum_ic_close_vd_theme_24"
-          android:tint="@color/dialer_primary_text_color_white"/>
+      <!-- We set this view's visibility to gone instead of the parent because if we hide remove
+      view, it won't receive drag and accessibility events. -->
+      <LinearLayout
+          android:id="@+id/remove_view_content"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          android:background="@color/dialer_theme_color"
+          android:gravity="center"
+          android:orientation="horizontal"
+          android:visibility="gone">
 
-      <TextView
-          android:id="@+id/remove_view_text"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="@string/main_remove_contact"
-          android:textColor="@color/dialer_primary_text_color_white"
-          android:textSize="16sp"/>
-    </LinearLayout>
-  </com.android.dialer.app.list.RemoveView>
+        <ImageView
+            android:id="@+id/remove_view_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:layout_marginBottom="8dp"
+            android:src="@drawable/quantum_ic_close_vd_theme_24"
+            android:tint="@color/dialer_primary_text_color_white"/>
+
+        <TextView
+            android:id="@+id/remove_view_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/main_remove_contact"
+            android:textColor="@color/dialer_primary_text_color_white"
+            android:textSize="16sp"/>
+      </LinearLayout>
+    </com.android.dialer.app.list.RemoveView>
+  </FrameLayout>
 </com.android.dialer.main.impl.toolbar.MainToolbar>