Merge "Removing contacts dependencies from CallDetailActivity."
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index cadbb6b..d716de0 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -51,11 +51,10 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.CallUtil;
-import com.android.contacts.ContactPhotoManager;
-import com.android.contacts.ContactsUtils;
-import com.android.contacts.format.FormatUtils;
 import com.android.contacts.common.ClipboardUtils;
+import com.android.contacts.common.GeoUtil;
 import com.android.dialer.BackScrollManager.ScrollableHeader;
 import com.android.dialer.calllog.CallDetailHistoryAdapter;
 import com.android.dialer.calllog.CallTypeHelper;
@@ -80,6 +79,9 @@
 public class CallDetailActivity extends Activity implements ProximitySensorAware {
     private static final String TAG = "CallDetail";
 
+    private static final char LEFT_TO_RIGHT_EMBEDDING = '\u202A';
+    private static final char POP_DIRECTIONAL_FORMATTING = '\u202C';
+
     /** The time to wait before enabling the blank the screen due to the proximity sensor. */
     private static final long PROXIMITY_BLANK_DELAY_MILLIS = 100;
     /** The time to wait before disabling the blank the screen due to the proximity sensor. */
@@ -271,10 +273,10 @@
         mMainActionView = (ImageView) findViewById(R.id.main_action);
         mMainActionPushLayerView = (ImageButton) findViewById(R.id.main_action_push_layer);
         mContactBackgroundView = (ImageView) findViewById(R.id.contact_background);
-        mDefaultCountryIso = ContactsUtils.getCurrentCountryIso(this);
+        mDefaultCountryIso = GeoUtil.getCurrentCountryIso(this);
         mContactPhotoManager = ContactPhotoManager.getInstance(this);
         mProximitySensorManager = new ProximitySensorManager(this, mProximitySensorListener);
-        mContactInfoHelper = new ContactInfoHelper(this, ContactsUtils.getCurrentCountryIso(this));
+        mContactInfoHelper = new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this));
         configureActionBar();
         optionallyHandleVoicemail();
         if (getIntent().getBooleanExtra(EXTRA_FROM_NOTIFICATION, false)) {
@@ -511,7 +513,7 @@
 
                     ViewEntry entry = new ViewEntry(
                             getString(R.string.menu_callNumber,
-                                    FormatUtils.forceLeftToRight(displayNumber)),
+                                    forceLeftToRight(displayNumber)),
                                     CallUtil.getCallIntent(mNumber),
                                     getString(R.string.description_call, nameOrNumber));
 
@@ -935,4 +937,13 @@
             mTargetView.setBackground(mOriginalViewBackground);
         }
     }
+
+    /** Returns the given text, forced to be left-to-right. */
+    private static CharSequence forceLeftToRight(CharSequence text) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(LEFT_TO_RIGHT_EMBEDDING);
+        sb.append(text);
+        sb.append(POP_DIRECTIONAL_FORMATTING);
+        return sb.toString();
+    }
 }
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 230c8f4..e66dd34 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -57,7 +57,6 @@
 import android.widget.SearchView.OnQueryTextListener;
 
 import com.android.contacts.common.CallUtil;
-import com.android.contacts.ContactsUtils;
 import com.android.contacts.activities.TransactionSafeActivity;
 import com.android.contacts.interactions.PhoneNumberInteraction;
 import com.android.contacts.list.ContactListFilterController;
@@ -69,6 +68,7 @@
 import com.android.dialer.calllog.CallLogFragment;
 import com.android.dialer.dialpad.DialpadFragment;
 import com.android.dialer.list.PhoneFavoriteFragment;
+import com.android.dialer.util.OrientationUtil;
 import com.android.internal.telephony.ITelephony;
 
 /**
@@ -1018,7 +1018,7 @@
             // This is when the user is looking at the dialer pad.  In this case, the real
             // ActionBar is hidden and fake menu items are shown.
             // Except in landscape, in which case the real search menu item is shown.
-            searchMenuItem.setVisible(ContactsUtils.isLandscape(this));
+            searchMenuItem.setVisible(OrientationUtil.isLandscape(this));
             // If a permanent menu key is available, then we need to show the call settings item
             // so that the call settings item can be invoked by the permanent menu key.
             callSettingsMenuItem.setVisible(ViewConfiguration.get(this).hasPermanentMenuKey());
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 1899bc5..b0af99a 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -32,8 +32,8 @@
 import android.view.ViewTreeObserver;
 
 import com.android.common.widget.GroupingListAdapter;
-import com.android.contacts.ContactPhotoManager;
-import com.android.contacts.util.UriUtils;
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.PhoneCallDetails;
 import com.android.dialer.PhoneCallDetailsHelper;
 import com.android.dialer.R;
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index 6047154..eb0b371 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -46,8 +46,8 @@
 import android.widget.TextView;
 
 import com.android.common.io.MoreCloseables;
-import com.android.contacts.ContactsUtils;
 import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.GeoUtil;
 import com.android.dialer.R;
 import com.android.dialer.util.EmptyLoader;
 import com.android.dialer.voicemail.VoicemailStatusHelper;
@@ -220,7 +220,7 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        String currentCountryIso = ContactsUtils.getCurrentCountryIso(getActivity());
+        String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
         mAdapter = new CallLogAdapter(getActivity(), this,
                 new ContactInfoHelper(getActivity(), currentCountryIso));
         setListAdapter(mAdapter);
diff --git a/src/com/android/dialer/calllog/ContactInfo.java b/src/com/android/dialer/calllog/ContactInfo.java
index b48adef..e0a074d 100644
--- a/src/com/android/dialer/calllog/ContactInfo.java
+++ b/src/com/android/dialer/calllog/ContactInfo.java
@@ -19,7 +19,7 @@
 import android.net.Uri;
 import android.text.TextUtils;
 
-import com.android.contacts.util.UriUtils;
+import com.android.contacts.common.util.UriUtils;
 
 /**
  * Information for a contact as needed by the Call Log.
diff --git a/src/com/android/dialer/calllog/ContactInfoHelper.java b/src/com/android/dialer/calllog/ContactInfoHelper.java
index b6f0662..abe4a06 100644
--- a/src/com/android/dialer/calllog/ContactInfoHelper.java
+++ b/src/com/android/dialer/calllog/ContactInfoHelper.java
@@ -24,7 +24,7 @@
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
-import com.android.contacts.util.UriUtils;
+import com.android.contacts.common.util.UriUtils;
 
 /**
  * Utility class to look up the contact information for a given number.
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 014f188..776b2c9 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -67,13 +67,14 @@
 import android.widget.PopupMenu;
 import android.widget.TextView;
 
-import com.android.contacts.ContactsUtils;
 import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.GeoUtil;
 import com.android.contacts.util.PhoneNumberFormatter;
 import com.android.contacts.util.StopWatch;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.R;
 import com.android.dialer.SpecialCharSequenceMgr;
+import com.android.dialer.util.OrientationUtil;
 import com.android.internal.telephony.ITelephony;
 import com.android.phone.common.CallLogAsync;
 import com.android.phone.common.HapticFeedback;
@@ -200,6 +201,16 @@
 
     private static final String PREF_DIGITS_FILLED_BY_INTENT = "pref_digits_filled_by_intent";
 
+    /**
+     * Return an Intent for launching voicemail screen.
+     */
+    private static Intent getVoicemailIntent() {
+        final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
+                Uri.fromParts("voicemail", "", null));
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        return intent;
+    }
+
     @Override
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
         mWasEmptyBeforeTextChange = TextUtils.isEmpty(s);
@@ -241,7 +252,7 @@
     public void onCreate(Bundle state) {
         super.onCreate(state);
 
-        mCurrentCountryIso = ContactsUtils.getCurrentCountryIso(getActivity());
+        mCurrentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
 
         try {
             mHaptic.init(getActivity(),
@@ -290,7 +301,7 @@
         mDialButtonContainer = fragmentView.findViewById(R.id.dialButtonContainer);
         // If in portrait, add padding to the dial button since we need space for the
         // search and menu/overflow buttons.
-        if (mDialButtonContainer != null && !ContactsUtils.isLandscape(this.getActivity())) {
+        if (mDialButtonContainer != null && !OrientationUtil.isLandscape(this.getActivity())) {
             mDialButtonContainer.setPadding(
                     fakeMenuItemWidth, mDialButtonContainer.getPaddingTop(),
                     fakeMenuItemWidth, mDialButtonContainer.getPaddingBottom());
@@ -625,7 +636,7 @@
         super.onCreateOptionsMenu(menu, inflater);
         // Landscape dialer uses the real actionbar menu, whereas portrait uses a fake one
         // that is created using constructPopupMenu()
-        if (ContactsUtils.isLandscape(this.getActivity()) ||
+        if (OrientationUtil.isLandscape(this.getActivity()) ||
                 ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
                 isLayoutReady() && mDialpadChooser != null) {
             inflater.inflate(R.menu.dialpad_options, menu);
@@ -635,7 +646,7 @@
     @Override
     public void onPrepareOptionsMenu(Menu menu) {
         // Hardware menu key should be available and Views should already be ready.
-        if (ContactsUtils.isLandscape(this.getActivity()) ||
+        if (OrientationUtil.isLandscape(this.getActivity()) ||
                 ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
                 isLayoutReady() && mDialpadChooser != null) {
             setupMenuItems(menu);
@@ -1000,7 +1011,7 @@
     }
 
     public void callVoicemail() {
-        startActivity(ContactsUtils.getVoicemailIntent());
+        startActivity(getVoicemailIntent());
         mClearDigitsOnStop = true;
         getActivity().finish();
     }
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java
index e7ef808..4976472 100644
--- a/src/com/android/dialer/list/PhoneFavoriteFragment.java
+++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java
@@ -45,7 +45,7 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import com.android.contacts.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.ContactTileLoaderFactory;
 import com.android.contacts.dialog.ClearFrequentsDialog;
 import com.android.contacts.interactions.ImportExportDialogFragment;
diff --git a/src/com/android/dialer/util/OrientationUtil.java b/src/com/android/dialer/util/OrientationUtil.java
new file mode 100644
index 0000000..2eb2af3
--- /dev/null
+++ b/src/com/android/dialer/util/OrientationUtil.java
@@ -0,0 +1,34 @@
+/*
+ * 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.util;
+
+import android.content.Context;
+import android.content.res.Configuration;
+
+/**
+ * Static methods related to device orientation.
+ */
+public class OrientationUtil {
+
+    /**
+     * @return if the context is in landscape orientation.
+     */
+    public static boolean isLandscape(Context context) {
+        return context.getResources().getConfiguration().orientation
+                == Configuration.ORIENTATION_LANDSCAPE;
+    }
+}
diff --git a/src/com/android/dialer/voicemail/VoicemailStatusHelperImpl.java b/src/com/android/dialer/voicemail/VoicemailStatusHelperImpl.java
index 284b836..ff17868 100644
--- a/src/com/android/dialer/voicemail/VoicemailStatusHelperImpl.java
+++ b/src/com/android/dialer/voicemail/VoicemailStatusHelperImpl.java
@@ -28,7 +28,7 @@
 import android.net.Uri;
 import android.provider.VoicemailContract.Status;
 
-import com.android.contacts.util.UriUtils;
+import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.R;
 
 import java.util.ArrayList;