Merge "Fix name matching bug with non space separators" into jb-mr2-dev
diff --git a/Android.mk b/Android.mk
index 97dfd82..ea13c65 100644
--- a/Android.mk
+++ b/Android.mk
@@ -34,5 +34,5 @@
 
 include $(BUILD_PACKAGE)
 
-# Use the folloing include to make our test apk.
+# Use the following include to make our test apk.
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index eb05186..bde0775 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -48,7 +48,8 @@
     <application
         android:label="@string/applicationLabel"
         android:icon="@mipmap/ic_launcher_phone"
-        android:hardwareAccelerated="true">
+        android:hardwareAccelerated="true"
+        android:supportsRtl="true">
 
         <!-- The entrance point for Phone UI.
              stateAlwaysHidden is set to suppress keyboard show up on
diff --git a/res/drawable-ar-hdpi/dial_num_0_wht.png b/res/drawable-ar-hdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..d06bb6b
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_1_wht.png b/res/drawable-ar-hdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..397ec32
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_2_wht.png b/res/drawable-ar-hdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..ca62c2d
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_3_wht.png b/res/drawable-ar-hdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..8872968
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_4_wht.png b/res/drawable-ar-hdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..6f68884
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_5_wht.png b/res/drawable-ar-hdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..d107f73
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_6_wht.png b/res/drawable-ar-hdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..e46474e
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_7_wht.png b/res/drawable-ar-hdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..d121401
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_8_wht.png b/res/drawable-ar-hdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..546574b
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-ar-hdpi/dial_num_9_wht.png b/res/drawable-ar-hdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..7e6a712
--- /dev/null
+++ b/res/drawable-ar-hdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_0_wht.png b/res/drawable-ar-mdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..5f7eb7f
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_1_wht.png b/res/drawable-ar-mdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..8a7d086
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_2_wht.png b/res/drawable-ar-mdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..87c1d49
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_3_wht.png b/res/drawable-ar-mdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..e600393
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_4_wht.png b/res/drawable-ar-mdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..d2414c9
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_5_wht.png b/res/drawable-ar-mdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..060f904
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_6_wht.png b/res/drawable-ar-mdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..5763ab8
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_7_wht.png b/res/drawable-ar-mdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..5c81896
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_8_wht.png b/res/drawable-ar-mdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..7744206
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-ar-mdpi/dial_num_9_wht.png b/res/drawable-ar-mdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..a0c488c
--- /dev/null
+++ b/res/drawable-ar-mdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_0_wht.png b/res/drawable-ar-xhdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..069afe6
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_1_wht.png b/res/drawable-ar-xhdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..b960b45
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_2_wht.png b/res/drawable-ar-xhdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..9c6d393
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_3_wht.png b/res/drawable-ar-xhdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..16cc930
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_4_wht.png b/res/drawable-ar-xhdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..2de96da
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_5_wht.png b/res/drawable-ar-xhdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..a0b1d8a
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_6_wht.png b/res/drawable-ar-xhdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..24cc107
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_7_wht.png b/res/drawable-ar-xhdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..59be814
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_8_wht.png b/res/drawable-ar-xhdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..30f30d2
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-ar-xhdpi/dial_num_9_wht.png b/res/drawable-ar-xhdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..12651f3
--- /dev/null
+++ b/res/drawable-ar-xhdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_0_wht.png b/res/drawable-fa-hdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..d06bb6b
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_1_wht.png b/res/drawable-fa-hdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..397ec32
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_2_wht.png b/res/drawable-fa-hdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..ca62c2d
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_3_wht.png b/res/drawable-fa-hdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..8872968
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_4_wht.png b/res/drawable-fa-hdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..72e5904
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_5_wht.png b/res/drawable-fa-hdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..9261534
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_6_wht.png b/res/drawable-fa-hdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..2f6141d
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_7_wht.png b/res/drawable-fa-hdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..d121401
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_8_wht.png b/res/drawable-fa-hdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..546574b
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-fa-hdpi/dial_num_9_wht.png b/res/drawable-fa-hdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..7e6a712
--- /dev/null
+++ b/res/drawable-fa-hdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_0_wht.png b/res/drawable-fa-mdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..5f7eb7f
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_1_wht.png b/res/drawable-fa-mdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..8a7d086
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_2_wht.png b/res/drawable-fa-mdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..87c1d49
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_3_wht.png b/res/drawable-fa-mdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..e600393
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_4_wht.png b/res/drawable-fa-mdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..7375890
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_5_wht.png b/res/drawable-fa-mdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..e8a3156
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_6_wht.png b/res/drawable-fa-mdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..79cdc1c
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_7_wht.png b/res/drawable-fa-mdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..5c81896
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_8_wht.png b/res/drawable-fa-mdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..7744206
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-fa-mdpi/dial_num_9_wht.png b/res/drawable-fa-mdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..a0c488c
--- /dev/null
+++ b/res/drawable-fa-mdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_0_wht.png b/res/drawable-fa-xhdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..069afe6
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_0_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_1_wht.png b/res/drawable-fa-xhdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..b960b45
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_1_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_2_wht.png b/res/drawable-fa-xhdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..9c6d393
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_2_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_3_wht.png b/res/drawable-fa-xhdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..16cc930
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_3_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_4_wht.png b/res/drawable-fa-xhdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..f956a0b
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_4_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_5_wht.png b/res/drawable-fa-xhdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..da4c892
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_5_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_6_wht.png b/res/drawable-fa-xhdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..1f7dc6a
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_6_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_7_wht.png b/res/drawable-fa-xhdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..59be814
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_7_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_8_wht.png b/res/drawable-fa-xhdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..30f30d2
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_8_wht.png
Binary files differ
diff --git a/res/drawable-fa-xhdpi/dial_num_9_wht.png b/res/drawable-fa-xhdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..12651f3
--- /dev/null
+++ b/res/drawable-fa-xhdpi/dial_num_9_wht.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_ab_dialer_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_ab_dialer_holo_dark.png
new file mode 100644
index 0000000..bc3ebc7
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_ab_dialer_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.png
new file mode 100644
index 0000000..3b3fb46
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.png
new file mode 100644
index 0000000..844f351
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.png
new file mode 100644
index 0000000..7861986
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_dial_action_call.png b/res/drawable-ldrtl-hdpi/ic_dial_action_call.png
new file mode 100644
index 0000000..34c78ff
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_dial_action_call.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_sound_off_speakerphone_disabled_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_sound_off_speakerphone_disabled_holo_dark.png
new file mode 100644
index 0000000..90712b5
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_sound_off_speakerphone_disabled_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_sound_off_speakerphone_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_sound_off_speakerphone_holo_dark.png
new file mode 100644
index 0000000..d50d5b8
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_sound_off_speakerphone_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_sound_speakerphone_disabled_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_sound_speakerphone_disabled_holo_dark.png
new file mode 100644
index 0000000..b450641
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_sound_speakerphone_disabled_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_sound_speakerphone_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_sound_speakerphone_holo_dark.png
new file mode 100644
index 0000000..ab62399
--- /dev/null
+++ b/res/drawable-ldrtl-hdpi/ic_sound_speakerphone_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_ab_dialer_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_ab_dialer_holo_dark.png
new file mode 100644
index 0000000..210690f
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_ab_dialer_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.png
new file mode 100644
index 0000000..b48e0d6
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.png
new file mode 100644
index 0000000..86bae10
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.png
new file mode 100644
index 0000000..1429593
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_dial_action_call.png b/res/drawable-ldrtl-mdpi/ic_dial_action_call.png
new file mode 100644
index 0000000..d1f00f1
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_dial_action_call.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_sound_off_speakerphone_disabled_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_sound_off_speakerphone_disabled_holo_dark.png
new file mode 100644
index 0000000..9daf083
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_sound_off_speakerphone_disabled_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_sound_off_speakerphone_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_sound_off_speakerphone_holo_dark.png
new file mode 100644
index 0000000..e8357c1
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_sound_off_speakerphone_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_sound_speakerphone_disabled_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_sound_speakerphone_disabled_holo_dark.png
new file mode 100644
index 0000000..8ba42f8
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_sound_speakerphone_disabled_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_sound_speakerphone_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_sound_speakerphone_holo_dark.png
new file mode 100644
index 0000000..0b7296d
--- /dev/null
+++ b/res/drawable-ldrtl-mdpi/ic_sound_speakerphone_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_ab_dialer_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_ab_dialer_holo_dark.png
new file mode 100644
index 0000000..5c8e162
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_ab_dialer_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.png
new file mode 100644
index 0000000..dfb1792
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.png
new file mode 100644
index 0000000..a1236ed
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.png
new file mode 100644
index 0000000..ec0e1d0
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_dial_action_call.png b/res/drawable-ldrtl-xhdpi/ic_dial_action_call.png
new file mode 100644
index 0000000..e0d2688
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_dial_action_call.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_sound_off_speakerphone_disabled_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_sound_off_speakerphone_disabled_holo_dark.png
new file mode 100644
index 0000000..396c479
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_sound_off_speakerphone_disabled_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_sound_off_speakerphone_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_sound_off_speakerphone_holo_dark.png
new file mode 100644
index 0000000..ca080b2
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_sound_off_speakerphone_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_sound_speakerphone_disabled_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_sound_speakerphone_disabled_holo_dark.png
new file mode 100644
index 0000000..c809e8d
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_sound_speakerphone_disabled_holo_dark.png
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_sound_speakerphone_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_sound_speakerphone_holo_dark.png
new file mode 100644
index 0000000..f82a816
--- /dev/null
+++ b/res/drawable-ldrtl-xhdpi/ic_sound_speakerphone_holo_dark.png
Binary files differ
diff --git a/res/layout-land/dialpad_fragment.xml b/res/layout-land/dialpad_fragment.xml
index d1cf3a4..658a03b 100644
--- a/res/layout-land/dialpad_fragment.xml
+++ b/res/layout-land/dialpad_fragment.xml
@@ -17,7 +17,8 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/top"
     android:layout_width="match_parent"
-    android:layout_height="match_parent" >
+    android:layout_height="match_parent"
+    android:layoutDirection="ltr" >
 
     <LinearLayout
         android:layout_width="0dp"
diff --git a/res/layout/account_filter_header_for_phone_favorite.xml b/res/layout/account_filter_header_for_phone_favorite.xml
index d7afaac..b55210a 100644
--- a/res/layout/account_filter_header_for_phone_favorite.xml
+++ b/res/layout/account_filter_header_for_phone_favorite.xml
@@ -25,20 +25,20 @@
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:paddingTop="8dip"
-    android:layout_marginLeft="@dimen/contact_browser_list_header_left_margin"
-    android:layout_marginRight="@dimen/contact_browser_list_header_right_margin"
+    android:layout_marginStart="@dimen/contact_browser_list_header_left_margin"
+    android:layout_marginEnd="@dimen/contact_browser_list_header_right_margin"
     android:background="?android:attr/selectableItemBackground"
     android:visibility="gone">
     <TextView
         android:id="@+id/account_filter_header"
         style="@style/ContactListSeparatorTextViewStyle"
-        android:paddingLeft="@dimen/contact_browser_list_item_text_indent" />
+        android:paddingStart="@dimen/contact_browser_list_item_text_indent" />
     <TextView
         android:id="@+id/contact_list_all_empty"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:textColor="?android:attr/textColorSecondary"
-        android:paddingLeft="8dip"
+        android:paddingStart="8dip"
         android:paddingTop="@dimen/contact_phone_list_empty_description_padding"
         android:paddingBottom="@dimen/contact_phone_list_empty_description_padding"
         android:textSize="@dimen/contact_phone_list_empty_description_size"
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index dc0417b..c25b4a9 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -31,7 +31,7 @@
         android:id="@+id/history"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
         android:layout_alignParentTop="true"
     />
 
@@ -40,14 +40,14 @@
         android:id="@+id/controls"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
         android:layout_alignParentTop="true"
     >
         <FrameLayout
             android:id="@+id/voicemail_status"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
+            android:layout_alignParentStart="true"
             android:layout_alignParentTop="true"
             android:visibility="gone"
         >
@@ -59,7 +59,7 @@
             android:id="@+id/contact_background_sizer"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
+            android:layout_alignParentStart="true"
             android:layout_below="@id/voicemail_status"
             ex:ratio="0.5"
             ex:direction="widthToHeight"
@@ -84,7 +84,7 @@
             android:layout_width="match_parent"
             android:layout_height="42dip"
             android:background="#7F000000"
-            android:layout_alignParentLeft="true"
+            android:layout_alignParentStart="true"
             android:layout_alignBottom="@id/contact_background_sizer"
         />
         <ImageView
@@ -92,21 +92,21 @@
             android:layout_width="wrap_content"
             android:layout_height="0dip"
             android:scaleType="center"
-            android:layout_alignRight="@id/photo_text_bar"
+            android:layout_alignEnd="@id/photo_text_bar"
             android:layout_alignBottom="@id/photo_text_bar"
             android:layout_alignTop="@id/photo_text_bar"
-            android:layout_marginRight="@dimen/call_log_outer_margin"
+            android:layout_marginEnd="@dimen/call_log_outer_margin"
         />
         <TextView
             android:id="@+id/header_text"
             android:layout_width="wrap_content"
             android:layout_height="0dip"
-            android:layout_alignLeft="@id/photo_text_bar"
+            android:layout_alignStart="@id/photo_text_bar"
             android:layout_toLeftOf="@id/main_action"
             android:layout_alignTop="@id/photo_text_bar"
             android:layout_alignBottom="@id/photo_text_bar"
-            android:layout_marginRight="@dimen/call_log_inner_margin"
-            android:layout_marginLeft="@dimen/call_detail_contact_name_margin"
+            android:layout_marginEnd="@dimen/call_log_inner_margin"
+            android:layout_marginStart="@dimen/call_detail_contact_name_margin"
             android:gravity="center_vertical"
             android:textColor="?attr/call_log_primary_text_color"
             android:textAppearance="?android:attr/textAppearanceMedium"
@@ -116,9 +116,9 @@
             android:id="@+id/main_action_push_layer"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_alignLeft="@id/contact_background_sizer"
+            android:layout_alignStart="@id/contact_background_sizer"
             android:layout_alignTop="@id/contact_background_sizer"
-            android:layout_alignRight="@id/contact_background_sizer"
+            android:layout_alignEnd="@id/contact_background_sizer"
             android:layout_alignBottom="@id/contact_background_sizer"
             android:background="?android:attr/selectableItemBackground"
         />
@@ -153,7 +153,7 @@
                     android:layout_width="0dip"
                     android:layout_height="match_parent"
                     android:layout_weight="1"
-                    android:paddingLeft="@dimen/call_log_indent_margin"
+                    android:paddingStart="@dimen/call_log_indent_margin"
                     android:orientation="vertical"
                     android:gravity="center_vertical"
                 >
@@ -161,7 +161,7 @@
                     <TextView android:id="@+id/call_and_sms_text"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:paddingRight="@dimen/call_log_icon_margin"
+                        android:paddingEnd="@dimen/call_log_icon_margin"
                         android:textAppearance="?android:attr/textAppearanceMedium"
                         android:textColor="?attr/call_log_primary_text_color"
                         android:singleLine="true"
@@ -171,7 +171,7 @@
                     <TextView android:id="@+id/call_and_sms_label"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:paddingRight="@dimen/call_log_icon_margin"
+                        android:paddingEnd="@dimen/call_log_icon_margin"
                         android:textAppearance="?android:attr/textAppearanceSmall"
                         android:textColor="?attr/call_log_primary_text_color"
                         android:textAllCaps="true"
@@ -190,8 +190,8 @@
                 <ImageView android:id="@+id/call_and_sms_icon"
                     android:layout_width="@color/call_log_voicemail_highlight_color"
                     android:layout_height="match_parent"
-                    android:paddingLeft="@dimen/call_log_inner_margin"
-                    android:paddingRight="@dimen/call_log_outer_margin"
+                    android:paddingStart="@dimen/call_log_inner_margin"
+                    android:paddingEnd="@dimen/call_log_outer_margin"
                     android:gravity="center"
                     android:scaleType="centerInside"
                     android:focusable="true"
@@ -209,7 +209,7 @@
         android:id="@+id/blank"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
         android:layout_alignParentTop="true"
         android:background="@android:color/black"
         android:visibility="gone"
diff --git a/res/layout/call_detail_history_header.xml b/res/layout/call_detail_history_header.xml
index 866ba41..40f943b 100644
--- a/res/layout/call_detail_history_header.xml
+++ b/res/layout/call_detail_history_header.xml
@@ -27,7 +27,7 @@
         class="com.android.contacts.common.widget.ProportionalLayout"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
         android:layout_below="@id/voicemail_status"
         ex:ratio="0.5"
         ex:direction="widthToHeight"
diff --git a/res/layout/call_detail_history_item.xml b/res/layout/call_detail_history_item.xml
index 01b9517..4858717 100644
--- a/res/layout/call_detail_history_item.xml
+++ b/res/layout/call_detail_history_item.xml
@@ -21,8 +21,8 @@
     android:minHeight="@dimen/call_log_list_item_height"
     android:paddingTop="@dimen/call_log_inner_margin"
     android:paddingBottom="@dimen/call_log_inner_margin"
-    android:paddingLeft="@dimen/call_log_indent_margin"
-    android:paddingRight="@dimen/call_log_outer_margin"
+    android:paddingStart="@dimen/call_log_indent_margin"
+    android:paddingEnd="@dimen/call_log_outer_margin"
     android:orientation="vertical"
 >
     <LinearLayout
@@ -41,7 +41,7 @@
             android:id="@+id/call_type_text"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="@dimen/call_log_icon_margin"
+            android:layout_marginStart="@dimen/call_log_icon_margin"
             android:textAppearance="?android:attr/textAppearanceSmall"
             android:textColor="@color/secondary_text_color"
         />
diff --git a/res/layout/call_log_fragment.xml b/res/layout/call_log_fragment.xml
index e86ca81..041ca7b 100644
--- a/res/layout/call_log_fragment.xml
+++ b/res/layout/call_log_fragment.xml
@@ -40,11 +40,11 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             style="@style/ContactListSeparatorTextViewStyle"
-            android:layout_marginLeft="@dimen/call_log_outer_margin"
-            android:layout_marginRight="@dimen/call_log_outer_margin"
+            android:layout_marginStart="@dimen/call_log_outer_margin"
+            android:layout_marginEnd="@dimen/call_log_outer_margin"
             android:paddingTop="@dimen/call_log_inner_margin"
             android:paddingBottom="@dimen/call_log_inner_margin"
-            android:layout_alignParentLeft="true"
+            android:layout_alignParentStart="true"
             android:layout_alignParentBottom="true"
             android:visibility="gone"
             />
@@ -52,8 +52,8 @@
             android:id="@+id/call_log_divider"
             android:layout_width="match_parent"
             android:layout_height="1px"
-            android:layout_marginLeft="@dimen/call_log_outer_margin"
-            android:layout_marginRight="@dimen/call_log_outer_margin"
+            android:layout_marginStart="@dimen/call_log_outer_margin"
+            android:layout_marginEnd="@dimen/call_log_outer_margin"
             android:layout_gravity="bottom"
             android:background="#55ffffff"
             />
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index 8564c0d..54f4fff 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -37,8 +37,8 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="@dimen/call_log_outer_margin"
-            android:layout_marginRight="@dimen/call_log_outer_margin"
+            android:layout_marginStart="@dimen/call_log_outer_margin"
+            android:layout_marginEnd="@dimen/call_log_outer_margin"
             android:orientation="horizontal"
             android:gravity="center_vertical"
             android:background="?android:attr/selectableItemBackground"
@@ -51,7 +51,7 @@
                 android:layout_width="@dimen/call_log_list_contact_photo_size"
                 android:layout_height="@dimen/call_log_list_contact_photo_size"
                 android:nextFocusRight="@id/primary_action_view"
-                android:layout_alignParentLeft="true"
+                android:layout_alignParentStart="true"
                 android:layout_centerVertical="true"
                 android:focusable="true"
             />
@@ -63,13 +63,13 @@
                 android:paddingBottom="@dimen/call_log_inner_margin"
                 android:orientation="vertical"
                 android:gravity="center_vertical"
-                android:layout_marginLeft="@dimen/call_log_inner_margin"
+                android:layout_marginStart="@dimen/call_log_inner_margin"
             >
                 <TextView
                     android:id="@+id/name"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginRight="@dimen/call_log_icon_margin"
+                    android:layout_marginEnd="@dimen/call_log_icon_margin"
                     android:textColor="?attr/call_log_primary_text_color"
                     android:textSize="18sp"
                     android:singleLine="true"
@@ -83,7 +83,7 @@
                         android:id="@+id/number"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:layout_marginRight="@dimen/call_log_icon_margin"
+                        android:layout_marginEnd="@dimen/call_log_icon_margin"
                         android:textColor="?attr/call_log_secondary_text_color"
                         android:textSize="14sp"
                         android:singleLine="true"
@@ -93,7 +93,7 @@
                         android:id="@+id/label"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:layout_marginRight="@dimen/call_log_icon_margin"
+                        android:layout_marginEnd="@dimen/call_log_icon_margin"
                         android:textColor="?attr/call_log_secondary_text_color"
                         android:textStyle="bold"
                         android:textSize="14sp"
@@ -112,14 +112,14 @@
                         android:id="@+id/call_type_icons"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:layout_marginRight="@dimen/call_log_icon_margin"
+                        android:layout_marginEnd="@dimen/call_log_icon_margin"
                         android:layout_gravity="center_vertical"
                     />
                     <TextView
                         android:id="@+id/call_count_and_date"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:layout_marginRight="@dimen/call_log_icon_margin"
+                        android:layout_marginEnd="@dimen/call_log_icon_margin"
                         android:layout_gravity="center_vertical"
                         android:textColor="?attr/call_log_secondary_text_color"
                         android:textSize="14sp"
@@ -138,10 +138,10 @@
                 android:id="@+id/secondary_action_icon"
                 android:layout_width="@dimen/call_log_call_action_width"
                 android:layout_height="match_parent"
-                android:paddingLeft="@dimen/call_log_inner_margin"
+                android:paddingStart="@dimen/call_log_inner_margin"
                 android:paddingTop="@dimen/call_log_inner_margin"
                 android:paddingBottom="@dimen/call_log_inner_margin"
-                android:paddingRight="@dimen/call_log_inner_margin"
+                android:paddingEnd="@dimen/call_log_inner_margin"
                 android:scaleType="center"
                 android:background="?android:attr/selectableItemBackground"
                 android:nextFocusLeft="@id/primary_action_view"
@@ -151,8 +151,8 @@
     <TextView
         android:id="@+id/call_log_header"
         style="@style/ContactListSeparatorTextViewStyle"
-        android:layout_marginLeft="@dimen/call_log_outer_margin"
-        android:layout_marginRight="@dimen/call_log_outer_margin"
+        android:layout_marginStart="@dimen/call_log_outer_margin"
+        android:layout_marginEnd="@dimen/call_log_outer_margin"
         android:paddingTop="@dimen/call_log_inner_margin"
         android:paddingBottom="@dimen/call_log_inner_margin" />
 
@@ -160,8 +160,8 @@
         android:id="@+id/call_log_divider"
         android:layout_width="match_parent"
         android:layout_height="1px"
-        android:layout_marginLeft="@dimen/call_log_outer_margin"
-        android:layout_marginRight="@dimen/call_log_outer_margin"
+        android:layout_marginStart="@dimen/call_log_outer_margin"
+        android:layout_marginEnd="@dimen/call_log_outer_margin"
         android:background="#55ffffff"
     />
 </view>
diff --git a/res/layout/call_log_voicemail_status.xml b/res/layout/call_log_voicemail_status.xml
index 191c821..be808e4 100644
--- a/res/layout/call_log_voicemail_status.xml
+++ b/res/layout/call_log_voicemail_status.xml
@@ -25,8 +25,8 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
             android:layout_weight="1"
-            android:paddingLeft="@dimen/call_log_outer_margin"
-            android:paddingRight="@dimen/call_log_inner_margin"
+            android:paddingStart="@dimen/call_log_outer_margin"
+            android:paddingEnd="@dimen/call_log_inner_margin"
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:textColor="?attr/call_log_voicemail_status_text_color"
         />
@@ -35,8 +35,8 @@
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:gravity="center_vertical"
-            android:paddingLeft="@dimen/call_log_inner_margin"
-            android:paddingRight="@dimen/call_log_outer_margin"
+            android:paddingStart="@dimen/call_log_inner_margin"
+            android:paddingEnd="@dimen/call_log_outer_margin"
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:textColor="?attr/call_log_voicemail_status_action_text_color"
             android:background="?android:attr/selectableItemBackground"
diff --git a/res/layout/dialpad.xml b/res/layout/dialpad.xml
index 3ccb42d..f9a0785 100644
--- a/res/layout/dialpad.xml
+++ b/res/layout/dialpad.xml
@@ -23,10 +23,11 @@
     android:layout_weight="@integer/dialpad_layout_weight_dialpad"
     android:layout_gravity="center_horizontal"
     android:layout_marginTop="@dimen/dialpad_vertical_margin"
-    android:paddingLeft="5dip"
-    android:paddingRight="5dip"
+    android:paddingStart="5dip"
+    android:paddingEnd="5dip"
     android:paddingBottom="10dip"
-    android:background="@drawable/dialpad_background">
+    android:background="@drawable/dialpad_background"
+    android:layoutDirection="ltr" >
 
     <TableRow
          android:layout_height="0px"
diff --git a/res/layout/dialpad_fragment.xml b/res/layout/dialpad_fragment.xml
index 27ba2da..13d91bd 100644
--- a/res/layout/dialpad_fragment.xml
+++ b/res/layout/dialpad_fragment.xml
@@ -19,8 +19,9 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:paddingLeft="@dimen/dialpad_horizontal_margin"
-    android:paddingRight="@dimen/dialpad_horizontal_margin">
+    android:paddingStart="@dimen/dialpad_horizontal_margin"
+    android:paddingEnd="@dimen/dialpad_horizontal_margin"
+    android:layoutDirection="ltr" >
 
     <!-- Text field and possibly soft menu button above the keypad where
          the digits are displayed. -->
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 35fa00f..079ce37 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -29,7 +29,7 @@
          android:id="@+id/searchButton"
          android:layout_width="wrap_content"
          android:layout_height="?android:attr/actionBarSize"
-         android:layout_gravity="bottom|left"
+         android:layout_gravity="bottom|start"
          android:state_enabled="false"
          android:background="?android:attr/selectableItemBackground"
          android:contentDescription="@string/description_search_button"
@@ -39,7 +39,7 @@
          android:id="@+id/overflow_menu"
          android:layout_width="wrap_content"
          android:layout_height="?android:attr/actionBarSize"
-         android:layout_gravity="bottom|right"
+         android:layout_gravity="bottom|end"
          android:src="@drawable/ic_menu_overflow"
          android:contentDescription="@string/action_menu_overflow_description"
          android:nextFocusLeft="@id/digits"
diff --git a/res/layout/dialtacts_custom_action_bar.xml b/res/layout/dialtacts_custom_action_bar.xml
index 26e4785..c62e225 100644
--- a/res/layout/dialtacts_custom_action_bar.xml
+++ b/res/layout/dialtacts_custom_action_bar.xml
@@ -32,10 +32,10 @@
     <ImageButton
         android:id="@+id/search_option"
         android:layout_width="wrap_content"
-        android:paddingLeft="4dip"
-        android:paddingRight="4dip"
+        android:paddingStart="4dip"
+        android:paddingEnd="4dip"
         android:layout_height="match_parent"
-        android:layout_alignParentRight="true"
+        android:layout_alignParentEnd="true"
         android:contentDescription="@string/action_menu_overflow_description"
         android:importantForAccessibility="yes"
         android:src="@drawable/ic_menu_overflow"
diff --git a/res/layout/phone_disambig_item.xml b/res/layout/phone_disambig_item.xml
index a31d08d..02d596b 100755
--- a/res/layout/phone_disambig_item.xml
+++ b/res/layout/phone_disambig_item.xml
@@ -18,8 +18,8 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:paddingLeft="30dip"
-    android:paddingRight="30dip"
+    android:paddingStart="30dip"
+    android:paddingEnd="30dip"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:gravity="center_vertical">
 
diff --git a/res/layout/phone_loading_contacts.xml b/res/layout/phone_loading_contacts.xml
index f0d3328..afc3322 100644
--- a/res/layout/phone_loading_contacts.xml
+++ b/res/layout/phone_loading_contacts.xml
@@ -21,7 +21,7 @@
     android:layout_height="match_parent"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:orientation="horizontal"
-    android:gravity="left|center_vertical">
+    android:gravity="start|center_vertical">
 
     <ProgressBar
         android:indeterminate="true"
@@ -35,6 +35,6 @@
         android:layout_height="wrap_content"
         android:text="@string/contact_list_loading"
         android:textAppearance="?android:attr/textAppearanceMedium"
-        android:layout_marginLeft="4dip" />
+        android:layout_marginStart="4dip" />
 
 </LinearLayout>
diff --git a/res/layout/playback_layout.xml b/res/layout/playback_layout.xml
index 2dfcb4d..b72ddca 100644
--- a/res/layout/playback_layout.xml
+++ b/res/layout/playback_layout.xml
@@ -31,7 +31,7 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="58dip"
-            android:layout_marginRight="@dimen/call_detail_button_spacing"
+            android:layout_marginEnd="@dimen/call_detail_button_spacing"
             android:background="@drawable/dialpad_background"
             android:layout_weight="1"
         >
@@ -79,12 +79,12 @@
             android:thumb="@drawable/seek_bar_thumb"
             android:thumbOffset="8dip"
             android:progress="0"
-            android:paddingLeft="8dip"
-            android:paddingRight="8dip"
+            android:paddingStart="8dip"
+            android:paddingEnd="8dip"
             android:paddingTop="30dip"
             android:paddingBottom="20dip"
-            android:layout_marginRight="64dip"
-            android:layout_marginLeft="64dip"
+            android:layout_marginEnd="64dip"
+            android:layout_marginStart="64dip"
             android:max="0"
             android:layout_centerVertical="true"
         />
@@ -115,7 +115,7 @@
             android:background="?android:attr/selectableItemBackground"
             android:paddingBottom="19dip"
             android:paddingTop="29dip"
-            android:layout_alignParentLeft="true"
+            android:layout_alignParentStart="true"
             android:layout_centerVertical="true"
         />
         <ImageButton
@@ -126,7 +126,7 @@
             android:background="?android:attr/selectableItemBackground"
             android:paddingBottom="19dip"
             android:paddingTop="29dip"
-            android:layout_alignParentRight="true"
+            android:layout_alignParentEnd="true"
             android:layout_centerVertical="true"
         />
     </RelativeLayout>
diff --git a/res/layout/set_primary_checkbox.xml b/res/layout/set_primary_checkbox.xml
index 8f28ec7..b997327 100644
--- a/res/layout/set_primary_checkbox.xml
+++ b/res/layout/set_primary_checkbox.xml
@@ -18,8 +18,8 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingLeft="14dip"
-    android:paddingRight="15dip"
+    android:paddingStart="14dip"
+    android:paddingEnd="15dip"
     android:orientation="vertical">
 
     <CheckBox
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 2557ebc..32339d2 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -680,7 +680,8 @@
             mSearchFragment.setOnPhoneNumberPickerActionListener(mPhoneNumberPickerActionListener);
             mSearchFragment.setQuickContactEnabled(true);
             mSearchFragment.setDarkTheme(true);
-            mSearchFragment.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT);
+            mSearchFragment.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(
+                    true /* opposite */));
             mSearchFragment.setUseCallableUri(true);
             if (mContactListFilterController != null
                     && mContactListFilterController.getFilter() != null) {
diff --git a/src/com/android/dialer/PhoneCallDetailsHelper.java b/src/com/android/dialer/PhoneCallDetailsHelper.java
index f8ca769..51b1109 100644
--- a/src/com/android/dialer/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/PhoneCallDetailsHelper.java
@@ -115,10 +115,14 @@
                 numberText = details.geocode;
             }
             labelText = null;
+            // We have a real phone number as "nameView" so make it always LTR
+            views.nameView.setTextDirection(View.TEXT_DIRECTION_LTR);
         } else {
             nameText = details.name;
             numberText = displayNumber;
             labelText = numberFormattedLabel;
+            // We have a real phone number as "numberView" so make it always LTR
+            views.numberView.setTextDirection(View.TEXT_DIRECTION_LTR);
         }
 
         views.nameView.setText(nameText);
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index f70a279..3693e6a 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -79,12 +79,12 @@
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.R;
 import com.android.dialer.SpecialCharSequenceMgr;
-import com.android.dialer.dialpad.SmartDialCache.SmartDialContentObserver;
 import com.android.dialer.interactions.PhoneNumberInteraction;
 import com.android.dialer.util.OrientationUtil;
 import com.android.internal.telephony.ITelephony;
 import com.android.phone.common.CallLogAsync;
 import com.android.phone.common.HapticFeedback;
+import com.google.common.annotations.VisibleForTesting;
 
 import java.util.List;
 
@@ -103,6 +103,8 @@
     private static final boolean DEBUG = DialtactsActivity.DEBUG;
 
     private static final String EMPTY_NUMBER = "";
+    private static final char PAUSE = ',';
+    private static final char WAIT = ';';
 
     /** The length of DTMF tones in milliseconds */
     private static final int TONE_LENGTH_MS = 150;
@@ -151,7 +153,6 @@
      * Will be set only if the view has the smart dialing section.
      */
     private SmartDialAdapter mSmartDialAdapter;
-    private SmartDialContentObserver mSmartDialObserver;
 
     /**
      * Regular expression prohibiting manual phone call. Can be empty, which means "no rule".
@@ -223,6 +224,7 @@
     private boolean mDigitsFilledByIntent;
 
     private boolean mStartedFromNewIntent = false;
+    private boolean mFirstLaunch = false;
 
     private static final String PREF_DIGITS_FILLED_BY_INTENT = "pref_digits_filled_by_intent";
 
@@ -277,7 +279,7 @@
     @Override
     public void onCreate(Bundle state) {
         super.onCreate(state);
-
+        mFirstLaunch = true;
         mContactsPrefs = new ContactsPreferences(getActivity());
         mCurrentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
         mSmartDialCache = SmartDialCache.getInstance(getActivity(),
@@ -297,10 +299,6 @@
         if (state != null) {
             mDigitsFilledByIntent = state.getBoolean(PREF_DIGITS_FILLED_BY_INTENT);
         }
-
-        mSmartDialObserver = new SmartDialContentObserver(new Handler(), mSmartDialCache);
-        this.getActivity().getContentResolver().registerContentObserver(
-                SmartDialCache.PhoneQuery.URI, true, mSmartDialObserver);
     }
 
     @Override
@@ -611,6 +609,19 @@
             showDialpadChooser(false);
         }
 
+        // Don't force recache if this is the first time onResume is being called, since caching
+        // should already happen in setUserVisibleHint.
+        if (!mFirstLaunch) {
+            // This forced recache covers the case where the dialer was previously running, and
+            // was brought back into the foreground. If the dialpad fragment hasn't actually
+            // become visible throughout the entire activity's lifecycle, it is possible that
+            // caching hasn't happened yet. In this case, we can force a recache anyway, since we
+            // are not worried about startup performance anymore.
+            mSmartDialCache.cacheIfNeeded(true);
+        }
+
+        mFirstLaunch = false;
+
         stopWatch.lap("hnt");
 
         updateDialAndDeleteButtonEnabledState();
@@ -618,9 +629,6 @@
         stopWatch.lap("bes");
 
         stopWatch.stopAndLog(TAG, 50);
-
-        this.getActivity().getContentResolver().registerContentObserver(
-                SmartDialCache.PhoneQuery.URI, true, mSmartDialObserver);
     }
 
     @Override
@@ -648,8 +656,6 @@
         mLastNumberDialed = EMPTY_NUMBER;  // Since we are going to query again, free stale number.
 
         SpecialCharSequenceMgr.cleanup();
-
-        getActivity().getContentResolver().unregisterContentObserver(mSmartDialObserver);
     }
 
     @Override
@@ -692,8 +698,6 @@
     private void setupMenuItems(Menu menu) {
         final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings_dialpad);
         final MenuItem addToContactMenuItem = menu.findItem(R.id.menu_add_contacts);
-        final MenuItem twoSecPauseMenuItem = menu.findItem(R.id.menu_2s_pause);
-        final MenuItem waitMenuItem = menu.findItem(R.id.menu_add_wait);
 
         // Check if all the menu items are inflated correctly. As a shortcut, we assume all menu
         // items are ready if the first item is non-null.
@@ -710,54 +714,17 @@
             callSettingsMenuItem.setIntent(DialtactsActivity.getCallSettingsIntent());
         }
 
-        // We show "add to contacts", "2sec pause", and "add wait" menus only when the user is
-        // seeing usual dialpads and has typed at least one digit.
+        // We show "add to contacts" menu only when the user is
+        // seeing usual dialpad and has typed at least one digit.
         // We never show a menu if the "choose dialpad" UI is up.
         if (dialpadChooserVisible() || isDigitsEmpty()) {
             addToContactMenuItem.setVisible(false);
-            twoSecPauseMenuItem.setVisible(false);
-            waitMenuItem.setVisible(false);
         } else {
             final CharSequence digits = mDigits.getText();
 
             // Put the current digits string into an intent
             addToContactMenuItem.setIntent(getAddToContactIntent(digits));
             addToContactMenuItem.setVisible(true);
-
-            // Check out whether to show Pause & Wait option menu items
-            int selectionStart;
-            int selectionEnd;
-            String strDigits = digits.toString();
-
-            selectionStart = mDigits.getSelectionStart();
-            selectionEnd = mDigits.getSelectionEnd();
-
-            if (selectionStart != -1) {
-                if (selectionStart > selectionEnd) {
-                    // swap it as we want start to be less then end
-                    int tmp = selectionStart;
-                    selectionStart = selectionEnd;
-                    selectionEnd = tmp;
-                }
-
-                if (selectionStart != 0) {
-                    // Pause can be visible if cursor is not in the begining
-                    twoSecPauseMenuItem.setVisible(true);
-
-                    // For Wait to be visible set of condition to meet
-                    waitMenuItem.setVisible(showWait(selectionStart, selectionEnd, strDigits));
-                } else {
-                    // cursor in the beginning both pause and wait to be invisible
-                    twoSecPauseMenuItem.setVisible(false);
-                    waitMenuItem.setVisible(false);
-                }
-            } else {
-                twoSecPauseMenuItem.setVisible(true);
-
-                // cursor is not selected so assume new digit is added to the end
-                int strLength = strDigits.length();
-                waitMenuItem.setVisible(showWait(strLength, strLength, strDigits));
-            }
         }
     }
 
@@ -1528,10 +1495,10 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.menu_2s_pause:
-                updateDialString(",");
+                updateDialString(PAUSE);
                 return true;
             case R.id.menu_add_wait:
-                updateDialString(";");
+                updateDialString(WAIT);
                 return true;
             default:
                 return false;
@@ -1547,7 +1514,12 @@
      * Updates the dial string (mDigits) after inserting a Pause character (,)
      * or Wait character (;).
      */
-    private void updateDialString(String newDigits) {
+    private void updateDialString(char newDigit) {
+        if(newDigit != WAIT && newDigit != PAUSE) {
+            Log.wtf(TAG, "Not expected for anything other than PAUSE & WAIT");
+            return;
+        }
+
         int selectionStart;
         int selectionEnd;
 
@@ -1558,20 +1530,19 @@
         selectionStart = Math.min(anchor, point);
         selectionEnd = Math.max(anchor, point);
 
+        if (selectionStart == -1) {
+            selectionStart = selectionEnd = mDigits.length();
+        }
+
         Editable digits = mDigits.getText();
-        if (selectionStart != -1) {
-            if (selectionStart == selectionEnd) {
-                // then there is no selection. So insert the pause at this
-                // position and update the mDigits.
-                digits.replace(selectionStart, selectionStart, newDigits);
-            } else {
-                digits.replace(selectionStart, selectionEnd, newDigits);
-                // Unselect: back to a regular cursor, just pass the character inserted.
-                mDigits.setSelection(selectionStart + 1);
+
+        if (canAddDigit(digits, selectionStart, selectionEnd, newDigit)) {
+            digits.replace(selectionStart, selectionEnd, Character.toString(newDigit));
+
+            if (selectionStart != selectionEnd) {
+              // Unselect: back to a regular cursor, just pass the character inserted.
+              mDigits.setSelection(selectionStart + 1);
             }
-        } else {
-            int len = mDigits.length();
-            digits.replace(len, len, newDigits);
         }
     }
 
@@ -1617,28 +1588,38 @@
     }
 
     /**
-     * This function return true if Wait menu item can be shown
-     * otherwise returns false. Assumes the passed string is non-empty
-     * and the 0th index check is not required.
+     * Returns true of the newDigit parameter can be added at the current selection
+     * point, otherwise returns false.
+     * Only prevents input of WAIT and PAUSE digits at an unsupported position.
+     * Fails early if start == -1 or start is larger than end.
      */
-    private static boolean showWait(int start, int end, String digits) {
-        if (start == end) {
-            // visible false in this case
-            if (start > digits.length()) return false;
-
-            // preceding char is ';', so visible should be false
-            if (digits.charAt(start - 1) == ';') return false;
-
-            // next char is ';', so visible should be false
-            if ((digits.length() > start) && (digits.charAt(start) == ';')) return false;
-        } else {
-            // visible false in this case
-            if (start > digits.length() || end > digits.length()) return false;
-
-            // In this case we need to just check for ';' preceding to start
-            // or next to end
-            if (digits.charAt(start - 1) == ';') return false;
+    @VisibleForTesting
+    /* package */ static boolean canAddDigit(CharSequence digits, int start, int end,
+                                             char newDigit) {
+        if(newDigit != WAIT && newDigit != PAUSE) {
+            Log.wtf(TAG, "Should not be called for anything other than PAUSE & WAIT");
+            return false;
         }
+
+        // False if no selection, or selection is reversed (end < start)
+        if (start == -1 || end < start) {
+            return false;
+        }
+
+        // unsupported selection-out-of-bounds state
+        if (start > digits.length() || end > digits.length()) return false;
+
+        // Special digit cannot be the first digit
+        if (start == 0) return false;
+
+        if (newDigit == WAIT) {
+            // preceding char is ';' (WAIT)
+            if (digits.charAt(start - 1) == WAIT) return false;
+
+            // next char is ';' (WAIT)
+            if ((digits.length() > end) && (digits.charAt(end) == WAIT)) return false;
+        }
+
         return true;
     }
 
@@ -1683,6 +1664,10 @@
     public void setUserVisibleHint(boolean isVisibleToUser) {
         super.setUserVisibleHint(isVisibleToUser);
         if (isVisibleToUser) {
+            // This is called if the dialpad fragment is swiped into to view for the very first
+            // time in the activity's lifecycle, or the user starts the dialer for the first time
+            // and the dialpad fragment is displayed immediately, and is what causes the initial
+            // caching process to happen.
             mSmartDialCache.cacheIfNeeded(false);
         }
     }
diff --git a/src/com/android/dialer/dialpad/DialpadImageButton.java b/src/com/android/dialer/dialpad/DialpadImageButton.java
index 5512a0c..8f9ea4d 100644
--- a/src/com/android/dialer/dialpad/DialpadImageButton.java
+++ b/src/com/android/dialer/dialpad/DialpadImageButton.java
@@ -18,10 +18,13 @@
 
 import android.content.Context;
 import android.graphics.Rect;
+import android.os.Bundle;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
 import android.widget.ImageButton;
 
 /**
@@ -81,20 +84,13 @@
     }
 
     @Override
-    public boolean performClick() {
-        // When accessibility is on, simulate press and release to preserve the
-        // semantic meaning of performClick(). Required for Braille support.
-        if (mAccessibilityManager.isEnabled()) {
-            // Checking the press state prevents double activation.
-            if (!isPressed()) {
-                setPressed(true);
-                setPressed(false);
-            }
-
+    public boolean performAccessibilityAction(int action, Bundle arguments) {
+        if (action == AccessibilityNodeInfo.ACTION_CLICK) {
+            simulateClickForAccessibility();
             return true;
         }
 
-        return super.performClick();
+        return super.performAccessibilityAction(action, arguments);
     }
 
     @Override
@@ -110,7 +106,7 @@
                     break;
                 case MotionEvent.ACTION_HOVER_EXIT:
                     if (mHoverBounds.contains((int) event.getX(), (int) event.getY())) {
-                        performClick();
+                        simulateClickForAccessibility();
                     }
                     setClickable(true);
                     break;
@@ -119,4 +115,23 @@
 
         return super.onHoverEvent(event);
     }
+
+    /**
+     * When accessibility is on, simulate press and release to preserve the
+     * semantic meaning of performClick(). Required for Braille support.
+     */
+    private void simulateClickForAccessibility() {
+        // Checking the press state prevents double activation.
+        if (isPressed()) {
+            return;
+        }
+
+        setPressed(true);
+
+        // Stay consistent with performClick() by sending the event after
+        // setting the pressed state but before performing the action.
+        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
+
+        setPressed(false);
+    }
 }
diff --git a/src/com/android/dialer/dialpad/DigitsEditText.java b/src/com/android/dialer/dialpad/DigitsEditText.java
index 6ad4df9..1a092be 100644
--- a/src/com/android/dialer/dialpad/DigitsEditText.java
+++ b/src/com/android/dialer/dialpad/DigitsEditText.java
@@ -21,7 +21,6 @@
 import android.text.InputType;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
-import android.view.accessibility.AccessibilityEvent;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 
@@ -56,31 +55,4 @@
         }
         return ret;
     }
-
-    @Override
-    public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
-        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) {
-            // Since we're replacing the text every time we add or remove a
-            // character, only read the difference. (issue 5337550)
-            final int added = event.getAddedCount();
-            final int removed = event.getRemovedCount();
-            final int length = event.getBeforeText().length();
-            if (added > removed) {
-                event.setRemovedCount(0);
-                event.setAddedCount(1);
-                event.setFromIndex(length);
-            } else if (removed > added) {
-                event.setRemovedCount(1);
-                event.setAddedCount(0);
-                event.setFromIndex(length - 1);
-            } else {
-                return;
-            }
-        } else if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) {
-            // The parent EditText class lets tts read "edit box" when this View has a focus, which
-            // confuses users on app launch (issue 5275935).
-            return;
-        }
-        super.sendAccessibilityEventUnchecked(event);
-    }
 }
diff --git a/src/com/android/dialer/dialpad/SmartDialCache.java b/src/com/android/dialer/dialpad/SmartDialCache.java
index 71f4dfe..79cc727 100644
--- a/src/com/android/dialer/dialpad/SmartDialCache.java
+++ b/src/com/android/dialer/dialpad/SmartDialCache.java
@@ -26,6 +26,7 @@
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.Directory;
 import android.util.Log;
 
@@ -104,7 +105,33 @@
         public static final int PHONE_LOOKUP_KEY   = 5;
         public static final int PHONE_DISPLAY_NAME = 6;
 
-        public static final String SORT_ORDER = Contacts.LAST_TIME_CONTACTED + " DESC";
+        // Current contacts - those contacted within the last 3 days (in milliseconds)
+        final static long LAST_TIME_USED_CURRENT_MS = 3 * 24 * 60 * 60 * 1000;
+
+        // Recent contacts - those contacted within the last 30 days (in milliseconds)
+        final static long LAST_TIME_USED_RECENT_MS = 30 * 24 * 60 * 60 * 1000;
+
+        final static String TIME_SINCE_LAST_USED_MS =
+                "(? - " + Data.LAST_TIME_USED + ")";
+
+        final static String SORT_BY_DATA_USAGE =
+                "(CASE WHEN " + TIME_SINCE_LAST_USED_MS + " < " + LAST_TIME_USED_CURRENT_MS +
+                " THEN 0 " +
+                " WHEN " + TIME_SINCE_LAST_USED_MS + " < " + LAST_TIME_USED_RECENT_MS +
+                " THEN 1 " +
+                " ELSE 2 END), " +
+                Data.TIMES_USED + " DESC";
+
+        // This sort order is similar to that used by the ContactsProvider when returning a list
+        // of frequently called contacts.
+        public static final String SORT_ORDER =
+                Contacts.STARRED + " DESC, "
+                + Data.IS_SUPER_PRIMARY + " DESC, "
+                + SORT_BY_DATA_USAGE + ", "
+                + Contacts.IN_VISIBLE_GROUP + " DESC, "
+                + Contacts.DISPLAY_NAME + ", "
+                + Data.CONTACT_ID + ", "
+                + Data.IS_PRIMARY + " DESC";
     }
 
     private SmartDialTrie mContactsCache;
@@ -117,7 +144,7 @@
     public static final int CACHE_IN_PROGRESS = 2;
     public static final int CACHE_COMPLETED = 3;
 
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
 
     private SmartDialCache(Context context, int nameDisplayOrder) {
         mNameDisplayOrder = nameDisplayOrder;
@@ -155,10 +182,12 @@
                 Log.d(LOG_TAG, "Starting caching thread");
             }
             final StopWatch stopWatch = DEBUG ? StopWatch.start("SmartDial Cache") : null;
+            final String millis = String.valueOf(System.currentTimeMillis());
             final Cursor c = context.getContentResolver().query(PhoneQuery.URI,
                     (mNameDisplayOrder == ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY)
                         ? PhoneQuery.PROJECTION_PRIMARY : PhoneQuery.PROJECTION_ALTERNATIVE,
-                    null, null, PhoneQuery.SORT_ORDER);
+                    null, new String[] {millis, millis},
+                    PhoneQuery.SORT_ORDER);
             if (DEBUG) {
                 stopWatch.lap("SmartDial query complete");
             }
@@ -243,8 +272,8 @@
 
     /**
      * Cache contacts only if there is a need to (forced cache refresh or no attempt to cache yet).
-     * This method is called in 2 places: whenever the DialpadFragment comes into view, and when the
-     * ContentObserver observes a change in contacts.
+     * This method is called in 2 places: whenever the DialpadFragment comes into view, and in
+     * onResume.
      *
      * @param forceRecache If true, force a cache refresh.
      */
@@ -284,32 +313,4 @@
         }
 
     }
-
-    public static class SmartDialContentObserver extends ContentObserver {
-        private final SmartDialCache mCache;
-        // throttle updates in case onChange is called too often due to syncing, etc.
-        private final long mThresholdBetweenUpdates = 5000;
-        private long mLastCalled = 0;
-        private long mLastUpdated = 0;
-        public SmartDialContentObserver(Handler handler, SmartDialCache cache) {
-            super(handler);
-            mCache = cache;
-        }
-
-        @Override
-        public void onChange(boolean selfChange) {
-            mLastCalled = System.currentTimeMillis();
-            if (DEBUG) {
-                Log.d(LOG_TAG, "Contacts change observed");
-            }
-            if (mLastCalled - mLastUpdated > mThresholdBetweenUpdates) {
-                mLastUpdated = mLastCalled;
-                if (DEBUG) {
-                    Log.d(LOG_TAG, "More than 5 seconds since last cache, forcing recache");
-                }
-                mCache.cacheIfNeeded(true);
-            }
-            super.onChange(selfChange);
-        }
-    }
 }
diff --git a/src/com/android/dialer/dialpad/SmartDialLoaderTask.java b/src/com/android/dialer/dialpad/SmartDialLoaderTask.java
index c2b1c2d..c5fc657 100644
--- a/src/com/android/dialer/dialpad/SmartDialLoaderTask.java
+++ b/src/com/android/dialer/dialpad/SmartDialLoaderTask.java
@@ -48,7 +48,7 @@
         void setSmartDialAdapterEntries(List<SmartDialEntry> list, String query);
     }
 
-    static private final boolean DEBUG = true; // STOPSHIP change to false.
+    static private final boolean DEBUG = false;
 
     private static final int MAX_ENTRIES = 3;
 
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java
index 93f38bb..97481bc 100644
--- a/src/com/android/dialer/list/PhoneFavoriteFragment.java
+++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java
@@ -301,8 +301,10 @@
         mAllContactsAdapter.setSectionHeaderDisplayEnabled(true);
         // Disable pinned header. It doesn't work with this fragment.
         mAllContactsAdapter.setPinnedPartitionHeadersEnabled(false);
-        // Put photos on left for consistency with "frequent" contacts section.
-        mAllContactsAdapter.setPhotoPosition(ContactListItemView.PhotoPosition.LEFT);
+        // Put photos on START (LEFT in LTR layout direction and RIGHT in RTL layout direction)
+        // for consistency with "frequent" contacts section.
+        mAllContactsAdapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(
+                true /* opposite */ ));
 
         // Use Callable.CONTENT_URI which will include not only phone numbers but also SIP
         // addresses.
diff --git a/tests/src/com/android/dialer/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/PhoneCallDetailsHelperTest.java
index 9617644..80bbf34 100644
--- a/tests/src/com/android/dialer/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/PhoneCallDetailsHelperTest.java
@@ -110,8 +110,8 @@
 
     public void testSetPhoneCallDetails_Normal() {
         setPhoneCallDetailsWithNumber("14125551212", "1-412-555-1212");
-        assertEquals("yesterday", mViews.callTypeAndDate.getText().toString());
-        assertEqualsHtml("<font color='#33b5e5'><b>yesterday</b></font>",
+        assertEquals("Yesterday", mViews.callTypeAndDate.getText().toString());
+        assertEqualsHtml("<font color='#33b5e5'><b>Yesterday</b></font>",
                 mViews.callTypeAndDate.getText());
     }
 
@@ -139,7 +139,7 @@
 
         setPhoneCallDetailsWithDate(
                 new GregorianCalendar(2011, 5, 2, 13, 0, 0).getTimeInMillis());
-        assertDateEquals("yesterday");
+        assertDateEquals("Yesterday");
 
         setPhoneCallDetailsWithDate(
                 new GregorianCalendar(2011, 5, 1, 13, 0, 0).getTimeInMillis());
@@ -266,7 +266,7 @@
             assertEquals(id, mViews.callTypeIcons.getCallType(index));
         }
         assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
-        assertEquals("yesterday", mViews.callTypeAndDate.getText().toString());
+        assertEquals("Yesterday", mViews.callTypeAndDate.getText().toString());
     }
 
     /**
@@ -280,7 +280,7 @@
             assertEquals(id, mViews.callTypeIcons.getCallType(index));
         }
         assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
-        assertEquals(overflowText + " yesterday", mViews.callTypeAndDate.getText().toString());
+        assertEquals(overflowText + " Yesterday", mViews.callTypeAndDate.getText().toString());
     }
 
     /** Sets the phone call details with default values and the given number. */
diff --git a/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java b/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java
new file mode 100644
index 0000000..a123e74
--- /dev/null
+++ b/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2012 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.dialer.dialpad;
+
+import android.test.suitebuilder.annotation.SmallTest;
+
+import junit.framework.TestCase;
+
+/** Unit tests for {@link DialpadFragment}. */
+@SmallTest
+public class DialpadFragmentTest extends TestCase {
+
+    public void testCanAddDigit_Valid() {
+        // end, middle, selection to end, middle selection
+        assertTrue(DialpadFragment.canAddDigit("123", 3, 3, ';'));
+        assertTrue(DialpadFragment.canAddDigit("123", 1, 1, ','));
+        assertTrue(DialpadFragment.canAddDigit("123", 1, 3, ';'));
+        assertTrue(DialpadFragment.canAddDigit("123", 1, 2, ','));
+    }
+
+    public void testCanAddDigit_InvalidCharacter() {
+        // only handles wait/pause
+        assertFalse(DialpadFragment.canAddDigit("123", 1, 1, '5'));
+    }
+
+    public void testCanAddDigit_BadOrNoSelection() {
+        // no selection
+        assertFalse(DialpadFragment.canAddDigit("123", -1, -1, ';'));
+        assertFalse(DialpadFragment.canAddDigit("123", -1, 1, ','));
+
+        // start > end
+        assertFalse(DialpadFragment.canAddDigit("123", 2, 1, ','));
+    }
+
+    public void testCanAddDigit_OutOfBounds() {
+        // start or end is > digits.length()
+        assertFalse(DialpadFragment.canAddDigit("123", 1, 4, ';'));
+        assertFalse(DialpadFragment.canAddDigit("123", 4, 4, ','));
+    }
+
+    public void testCanAddDigit_AsFirstCharacter() {
+        assertFalse(DialpadFragment.canAddDigit("", 0, 0, ','));
+        assertFalse(DialpadFragment.canAddDigit("123", 0, 0, ';'));
+        assertFalse(DialpadFragment.canAddDigit("123", 0, 2, ','));
+        assertFalse(DialpadFragment.canAddDigit("123", 0, 3, ','));
+    }
+
+    public void testCanAddDigit_AdjacentCharacters_Before() {
+        // before
+        assertFalse(DialpadFragment.canAddDigit("55;55", 2, 2, ';')); // WAIT
+        assertFalse(DialpadFragment.canAddDigit("55;55", 1, 2, ';'));
+        assertTrue(DialpadFragment.canAddDigit("55,55", 2, 2, ',')); // PAUSE
+        assertTrue(DialpadFragment.canAddDigit("55,55", 1, 2, ','));
+        assertTrue(DialpadFragment.canAddDigit("55;55", 2, 2, ',')); // WAIT & PAUSE
+        assertTrue(DialpadFragment.canAddDigit("55,55", 1, 2, ';'));
+    }
+
+    public void testCanAddDigit_AdjacentCharacters_After() {
+        // after
+        assertFalse(DialpadFragment.canAddDigit("55;55", 3, 3, ';')); // WAIT
+        assertFalse(DialpadFragment.canAddDigit("55;55", 3, 4, ';'));
+        assertTrue(DialpadFragment.canAddDigit("55,55", 3, 3, ',')); // PAUSE
+        assertTrue(DialpadFragment.canAddDigit("55,55", 3, 4, ','));
+        assertTrue(DialpadFragment.canAddDigit("55;55", 3, 3, ',')); // WAIT & PAUSE
+        assertTrue(DialpadFragment.canAddDigit("55,55", 3, 4, ';'));
+    }
+}