Merge "Avoid Resources$NotFoundException" into lmp-mr1-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 54fce69..50e398c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -221,7 +221,7 @@
         <activity
             android:name=".activities.ShowOrCreateActivity"
             android:label="@string/launcherActivityLabel"
-            android:theme="@android:style/Theme.Translucent.NoTitleBar">
+            android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar">
 
             <intent-filter>
                 <action android:name="com.android.contacts.action.SHOW_OR_CREATE_CONTACT" />
diff --git a/res/layout/quickcontact_header.xml b/res/layout/quickcontact_header.xml
index 37672c7..010146b 100644
--- a/res/layout/quickcontact_header.xml
+++ b/res/layout/quickcontact_header.xml
@@ -47,7 +47,8 @@
          this view, instead of another. This will *not* cause an additional draw since the
          background is transparent.-->
     <Toolbar
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
+        android:layout_gravity="end|top"
         android:layout_height="?android:attr/actionBarSize"
         android:background="#00000000"
         android:id="@+id/toolbar"/>
diff --git a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
index e3fa7e2..a1ff6d9 100644
--- a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
+++ b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
@@ -58,6 +58,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.editor.Editor;
 import com.android.contacts.editor.EditorUiUtils;
@@ -102,7 +103,7 @@
  * Note when there's no accounts, it *is* okay to show the picker / dialog, because the local-only
  * contacts are writable.
  */
-public class ConfirmAddDetailActivity extends Activity implements
+public class ConfirmAddDetailActivity extends ContactsActivity implements
         DialogManager.DialogShowingViewActivity {
 
     private static final String TAG = "ConfirmAdd"; // The class name is too long to be a tag.
diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
index bf3b1c1..197d3bd 100644
--- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java
@@ -28,6 +28,7 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.editor.ContactEditorUtils;
 import com.android.contacts.common.model.AccountTypeManager;
@@ -45,7 +46,7 @@
  * the new contact in. If the activity result doesn't contain intent data, then there is no
  * account for this contact.
  */
-public class ContactEditorAccountsChangedActivity extends Activity {
+public class ContactEditorAccountsChangedActivity extends ContactsActivity {
 
     private static final String TAG = ContactEditorAccountsChangedActivity.class.getSimpleName();
 
diff --git a/src/com/android/contacts/activities/PhotoSelectionActivity.java b/src/com/android/contacts/activities/PhotoSelectionActivity.java
index da0d2e4..a773f11 100644
--- a/src/com/android/contacts/activities/PhotoSelectionActivity.java
+++ b/src/com/android/contacts/activities/PhotoSelectionActivity.java
@@ -19,7 +19,6 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
-import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
@@ -33,6 +32,7 @@
 import android.widget.FrameLayout.LayoutParams;
 import android.widget.ImageView;
 
+import com.android.contacts.ContactsActivity;
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.R;
@@ -44,7 +44,7 @@
 /**
  * Popup activity for choosing a contact photo within the Contacts app.
  */
-public class PhotoSelectionActivity extends Activity {
+public class PhotoSelectionActivity extends ContactsActivity {
 
     private static final String TAG = "PhotoSelectionActivity";
 
diff --git a/src/com/android/contacts/activities/ShowOrCreateActivity.java b/src/com/android/contacts/activities/ShowOrCreateActivity.java
index abf89b6..0489065 100755
--- a/src/com/android/contacts/activities/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/activities/ShowOrCreateActivity.java
@@ -213,7 +213,7 @@
                 final CharSequence message = getResources().getString(
                         R.string.add_contact_dlg_message_fmt, mCreateDescrip);
 
-                return new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_LIGHT)
+                return new AlertDialog.Builder(this)
                         .setMessage(message)
                         .setPositiveButton(android.R.string.ok,
                                 new IntentClickListener(this, createIntent))
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index ed2520d..a2e32c9 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -93,6 +93,8 @@
 import com.android.contacts.util.HelpUtils;
 import com.android.contacts.util.PhoneCapabilityTester;
 import com.android.contacts.util.UiClosables;
+import com.android.contacts.commonbind.analytics.AnalyticsFragment;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
@@ -102,7 +104,7 @@
 import java.util.Comparator;
 import java.util.List;
 
-public class ContactEditorFragment extends Fragment implements
+public class ContactEditorFragment extends AnalyticsFragment implements
         SplitContactConfirmationDialogFragment.Listener,
         AggregationSuggestionEngine.Listener, AggregationSuggestionView.Listener,
         RawContactReadOnlyEditorView.Listener {
diff --git a/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java b/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java
index c790e0b..423052e 100644
--- a/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java
+++ b/src/com/android/contacts/editor/SplitContactConfirmationDialogFragment.java
@@ -24,6 +24,7 @@
 import android.os.Bundle;
 
 import com.android.contacts.R;
+import com.android.contacts.commonbind.analytics.AnalyticsDialogFragment;
 
 /**
  * Shows a dialog asking the user whether to split the contact. The result is passed back
@@ -31,7 +32,7 @@
  * has to implement {@link SplitContactConfirmationDialogFragment.Listener}.
  * Does not split the contact itself.
  */
-public class SplitContactConfirmationDialogFragment extends DialogFragment {
+public class SplitContactConfirmationDialogFragment extends AnalyticsDialogFragment {
     public static final String TAG = "SplitContactConfirmationDialog";
 
     public SplitContactConfirmationDialogFragment() {
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index 81cc28c..e511d52 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -47,11 +47,12 @@
 import com.android.contacts.group.GroupBrowseListAdapter.GroupListItemViewCache;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.list.AutoScrollListView;
+import com.android.contacts.commonbind.analytics.AnalyticsFragment;
 
 /**
  * Fragment to display the list of groups.
  */
-public class GroupBrowseListFragment extends Fragment
+public class GroupBrowseListFragment extends AnalyticsFragment
         implements OnFocusChangeListener, OnTouchListener {
 
     /**
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index c12595d..b8f8975 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -57,11 +57,12 @@
 import com.android.contacts.list.GroupMemberTileAdapter;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
+import com.android.contacts.commonbind.analytics.AnalyticsFragment;
 
 /**
  * Displays the details of a group and shows a list of actions possible for the group.
  */
-public class GroupDetailFragment extends Fragment implements OnScrollListener {
+public class GroupDetailFragment extends AnalyticsFragment implements OnScrollListener {
 
     public static interface Listener {
         /**
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index 3d13bdd..1b91ab8 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -72,13 +72,15 @@
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.common.util.ViewUtil;
+import com.android.contacts.commonbind.analytics.AnalyticsFragment;
 
 import com.google.common.base.Objects;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class GroupEditorFragment extends Fragment implements SelectAccountDialogFragment.Listener {
+public class GroupEditorFragment extends AnalyticsFragment
+        implements SelectAccountDialogFragment.Listener {
     private static final String TAG = "GroupEditorFragment";
 
     private static final String LEGACY_CONTACTS_AUTHORITY = "contacts";
diff --git a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
index 2df7fe2..7925ac0 100644
--- a/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupDeletionDialogFragment.java
@@ -17,18 +17,18 @@
 
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.FragmentManager;
 import android.content.DialogInterface;
 import android.os.Bundle;
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.R;
+import com.android.contacts.commonbind.analytics.AnalyticsDialogFragment;
 
 /**
  * A dialog for deleting a group.
  */
-public class GroupDeletionDialogFragment extends DialogFragment {
+public class GroupDeletionDialogFragment extends AnalyticsDialogFragment {
 
     private static final String ARG_GROUP_ID = "groupId";
     private static final String ARG_LABEL = "label";
diff --git a/src/com/android/contacts/interactions/GroupNameDialogFragment.java b/src/com/android/contacts/interactions/GroupNameDialogFragment.java
index b0ad9c9..8059fd4 100644
--- a/src/com/android/contacts/interactions/GroupNameDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupNameDialogFragment.java
@@ -31,11 +31,12 @@
 import android.widget.EditText;
 
 import com.android.contacts.R;
+import com.android.contacts.commonbind.analytics.AnalyticsDialogFragment;
 
 /**
  * A common superclass for creating and renaming groups.
  */
-public abstract class GroupNameDialogFragment extends DialogFragment {
+public abstract class GroupNameDialogFragment extends AnalyticsDialogFragment {
     protected abstract int getTitleResourceId();
     protected abstract void initializeGroupLabelEditText(EditText editText);
     protected abstract void onCompleted(String groupLabel);
diff --git a/src/com/android/contacts/list/ContactTileListFragment.java b/src/com/android/contacts/list/ContactTileListFragment.java
index 189cfd3..77c22e0 100644
--- a/src/com/android/contacts/list/ContactTileListFragment.java
+++ b/src/com/android/contacts/list/ContactTileListFragment.java
@@ -39,7 +39,7 @@
 import com.android.contacts.common.list.ContactTileAdapter.DisplayType;
 import com.android.contacts.common.list.ContactTileView;
 import com.android.contacts.common.util.ContactListViewUtils;
-import com.android.contacts.common.util.SchedulingUtils;
+import com.android.contacts.commonbind.analytics.AnalyticsFragment;
 
 /**
  * Fragment containing a list of starred contacts followed by a list of frequently contacted.
@@ -49,7 +49,7 @@
  * (i.e. adding header views to the ListViews in the fragment). This work was started
  * by creating {@link ContactTileFrequentFragment}.
  */
-public class ContactTileListFragment extends Fragment {
+public class ContactTileListFragment extends AnalyticsFragment {
     private static final String TAG = ContactTileListFragment.class.getSimpleName();
 
     public interface Listener {
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 70d224a..46f2138 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -15,7 +15,6 @@
  */
 package com.android.contacts.list;
 
-import android.app.Fragment;
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.ContactsContract.ProviderStatus;
@@ -29,12 +28,13 @@
 import android.widget.TextView;
 
 import com.android.contacts.R;
+import com.android.contacts.commonbind.analytics.AnalyticsFragment;
 
 /**
  * Fragment shown when contacts are unavailable. It contains provider status
  * messaging as well as instructions for the user.
  */
-public class ContactsUnavailableFragment extends Fragment implements OnClickListener {
+public class ContactsUnavailableFragment extends AnalyticsFragment implements OnClickListener {
 
     private View mView;
     private TextView mMessageView;
diff --git a/src/com/android/contacts/preference/ContactsPreferenceActivity.java b/src/com/android/contacts/preference/ContactsPreferenceActivity.java
index d47cb22..3ddffbb 100644
--- a/src/com/android/contacts/preference/ContactsPreferenceActivity.java
+++ b/src/com/android/contacts/preference/ContactsPreferenceActivity.java
@@ -20,18 +20,18 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.preference.PreferenceActivity;
 import android.view.MenuItem;
 
 import com.android.contacts.R;
 import com.android.contacts.activities.PeopleActivity;
+import com.android.contacts.commonbind.analytics.AnalyticsPreferenceActivity;
 
 import java.util.List;
 
 /**
  * Contacts settings.
  */
-public final class ContactsPreferenceActivity extends PreferenceActivity {
+public final class ContactsPreferenceActivity extends AnalyticsPreferenceActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 9cd854a..909b94b 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -177,8 +177,7 @@
 
     private static final int ANIMATION_STATUS_BAR_COLOR_CHANGE_DURATION = 150;
     private static final int REQUEST_CODE_CONTACT_EDITOR_ACTIVITY = 1;
-    private static final int DEFAULT_SCRIM_ALPHA = 0xC8;
-    private static final int SCRIM_COLOR = Color.argb(DEFAULT_SCRIM_ALPHA, 0, 0, 0);
+    private static final int SCRIM_COLOR = Color.argb(0xC8, 0, 0, 0);
     private static final int REQUEST_CODE_CONTACT_SELECTION_ACTIVITY = 2;
     private static final String MIMETYPE_SMS = "vnd.android-dir/mms-sms";
 
@@ -366,14 +365,6 @@
 
             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
-            // Force the window dim amount to the scrim value for app transition animations
-            // The scrim may be removed before the window transitions to the new activity, which
-            // can cause a flicker in the status and navigation bar. Set dim alone does not work
-            // well because the request is passed through IPC which makes it slow to animate.
-            getWindow().setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,
-                    WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-            getWindow().setDimAmount(mWindowScrim.getAlpha() / DEFAULT_SCRIM_ALPHA);
-
             mHasIntentLaunched = true;
             try {
                 startActivity(intent);
diff --git a/src/com/android/contacts/widget/MultiShrinkScroller.java b/src/com/android/contacts/widget/MultiShrinkScroller.java
index 72dc996..20bc5b1 100644
--- a/src/com/android/contacts/widget/MultiShrinkScroller.java
+++ b/src/com/android/contacts/widget/MultiShrinkScroller.java
@@ -41,6 +41,7 @@
 import android.widget.Scroller;
 import android.widget.ScrollView;
 import android.widget.TextView;
+import android.widget.Toolbar;
 
 /**
  * A custom {@link ViewGroup} that operates similarly to a {@link ScrollView}, except with multiple
@@ -103,7 +104,7 @@
     private MultiShrinkScrollerListener mListener;
     private TextView mLargeTextView;
     private View mPhotoTouchInterceptOverlay;
-    /** Contains desired location/size of the title, once the header is fully compressed */
+    /** Contains desired size & vertical offset of the title, once the header is fully compressed */
     private TextView mInvisiblePlaceholderTextView;
     private View mTitleGradientView;
     private View mActionBarGradientView;
@@ -303,6 +304,7 @@
         mTitleGradientView.setBackground(mTitleGradientDrawable);
         mActionBarGradientView = findViewById(R.id.action_bar_gradient);
         mActionBarGradientView.setBackground(mActionBarGradientDrawable);
+        mCollapsedTitleStartMargin = ((Toolbar) findViewById(R.id.toolbar)).getContentInsetStart();
 
         mPhotoTouchInterceptOverlay = findViewById(R.id.photo_touch_intercept_overlay);
         if (!mIsTwoPanel) {
@@ -1007,17 +1009,9 @@
      */
     private void calculateCollapsedLargeTitlePadding() {
         final Rect largeTextViewRect = new Rect();
-        final Rect invisiblePlaceholderTextViewRect = new Rect();
         mToolbar.getBoundsOnScreen(largeTextViewRect);
+        final Rect invisiblePlaceholderTextViewRect = new Rect();
         mInvisiblePlaceholderTextView.getBoundsOnScreen(invisiblePlaceholderTextViewRect);
-        if (isLayoutRtl()) {
-            mCollapsedTitleStartMargin = largeTextViewRect.right
-                    - invisiblePlaceholderTextViewRect.right;
-        } else {
-            mCollapsedTitleStartMargin = invisiblePlaceholderTextViewRect.left
-                    - largeTextViewRect.left;
-        }
-
         // Distance between top of toolbar to the center of the target rectangle.
         final int desiredTopToCenter = (
                 invisiblePlaceholderTextViewRect.top + invisiblePlaceholderTextViewRect.bottom)