resolve merge conflicts of d105c1e to master

Change-Id: If53abe8be5d8bd18e5f66699a113fdf27e01cfa3
diff --git a/src/com/android/contacts/DynamicShortcuts.java b/src/com/android/contacts/DynamicShortcuts.java
index f02306c..c21f3a0 100644
--- a/src/com/android/contacts/DynamicShortcuts.java
+++ b/src/com/android/contacts/DynamicShortcuts.java
@@ -45,6 +45,7 @@
 
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.Experiments;
+import com.android.contacts.common.compat.CompatUtils;
 import com.android.contacts.common.util.BitmapUtil;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contactsbind.experiments.Flags;
@@ -68,6 +69,11 @@
 public class DynamicShortcuts {
     private static final String TAG = "DynamicShortcuts";
 
+    // Must be the same as shortcutId in res/xml/shortcuts.xml
+    // Note: This doesn't fit very well because this is a "static" shortcut but it's still the most
+    // sensible place to put it right now.
+    public static final String SHORTCUT_ADD_CONTACT = "shortcut-add-contact";
+
     // Note the Nexus launcher automatically truncates shortcut labels if they exceed these limits
     // however, we implement our own truncation in case the shortcut is shown on a launcher that
     // has different behavior
@@ -372,7 +378,10 @@
                 .addTriggerContentUri(new JobInfo.TriggerContentUri(ContactsContract.AUTHORITY_URI,
                         JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
                 .setTriggerContentUpdateDelay(mContentChangeMinUpdateDelay)
-                .setTriggerContentMaxDelay(mContentChangeMaxUpdateDelay).build();
+                .setTriggerContentMaxDelay(mContentChangeMaxUpdateDelay)
+                // Minimize impact on UX by waiting for idle before updating.
+                .setRequiresDeviceIdle(true)
+                .build();
         mJobScheduler.schedule(job);
     }
 
@@ -390,7 +399,7 @@
                     flags.getInteger(Experiments.DYNAMIC_MAX_CONTENT_CHANGE_UPDATE_DELAY_MILLIS));
         }
 
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return;
+        if (!CompatUtils.isLauncherShortcutCompatible()) return;
 
         final DynamicShortcuts shortcuts = new DynamicShortcuts(context);
         if (!Flags.getInstance(context).getBoolean(Experiments.DYNAMIC_SHORTCUTS)) {
@@ -426,6 +435,13 @@
         return scheduler.getPendingJob(ContactsJobService.DYNAMIC_SHORTCUTS_JOB_ID) != null;
     }
 
+    public static void reportShortcutUsed(Context context, String lookupKey) {
+        if (!CompatUtils.isLauncherShortcutCompatible()) return;
+        final ShortcutManager shortcutManager = (ShortcutManager) context
+                .getSystemService(Context.SHORTCUT_SERVICE);
+        shortcutManager.reportShortcutUsed(lookupKey);
+    }
+
     private static class ShortcutUpdateTask extends AsyncTask<Void, Void, Void> {
         private DynamicShortcuts mDynamicShortcuts;
 
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 8c26e2e..5022947 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -30,6 +30,7 @@
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsActivity;
+import com.android.contacts.DynamicShortcuts;
 import com.android.contacts.R;
 import com.android.contacts.common.activity.RequestPermissionsActivity;
 import com.android.contacts.common.model.RawContactDeltaList;
@@ -387,6 +388,10 @@
         // Load editor data (even if it's hidden)
         final Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null;
         mFragment.load(action, uri, getIntent().getExtras());
+
+        if (Intent.ACTION_INSERT.equals(action)) {
+            DynamicShortcuts.reportShortcutUsed(this, DynamicShortcuts.SHORTCUT_ADD_CONTACT);
+        }
     }
 
     @Override
diff --git a/src/com/android/contacts/common/compat/CompatUtils.java b/src/com/android/contacts/common/compat/CompatUtils.java
index 567f183..a394093 100644
--- a/src/com/android/contacts/common/compat/CompatUtils.java
+++ b/src/com/android/contacts/common/compat/CompatUtils.java
@@ -173,6 +173,16 @@
         return VERSION.SDK_INT >= 24;
     }
 
+
+    public static boolean isNougatMr1Compatible() {
+        return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.N_MR1)
+                >= Build.VERSION_CODES.N_MR1;
+    }
+
+    public static boolean isLauncherShortcutCompatible() {
+        return isNougatMr1Compatible();
+    }
+
     /**
      * Determines if the given class is available. Can be used to check if system apis exist at
      * runtime.
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 8a1b5e9..87c339a 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -104,6 +104,7 @@
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsActivity;
+import com.android.contacts.DynamicShortcuts;
 import com.android.contacts.NfcHandler;
 import com.android.contacts.R;
 import com.android.contacts.activities.ContactEditorActivity;
@@ -124,10 +125,10 @@
 import com.android.contacts.common.list.ShortcutIntentBuilder;
 import com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
 import com.android.contacts.common.logging.Logger;
-import com.android.contacts.common.logging.ScreenEvent.ScreenType;
-import com.android.contacts.common.logging.QuickContactEvent.ContactType;
-import com.android.contacts.common.logging.QuickContactEvent.CardType;
 import com.android.contacts.common.logging.QuickContactEvent.ActionType;
+import com.android.contacts.common.logging.QuickContactEvent.CardType;
+import com.android.contacts.common.logging.QuickContactEvent.ContactType;
+import com.android.contacts.common.logging.ScreenEvent.ScreenType;
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.Contact;
 import com.android.contacts.common.model.ContactLoader;
@@ -183,7 +184,6 @@
 import com.android.contacts.widget.MultiShrinkScroller.MultiShrinkScrollerListener;
 import com.android.contacts.widget.QuickContactImageView;
 import com.android.contactsbind.HelpUtils;
-
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
@@ -261,6 +261,7 @@
 
     // Set true in {@link #onCreate} after orientation change for later use in processIntent().
     private boolean mIsRecreatedInstance;
+    private boolean mShortcutUsageReported = false;
 
     private boolean mShouldLog;
 
@@ -1246,6 +1247,7 @@
                 getIntent().getStringExtra(QuickContact.EXTRA_PRIORITIZED_MIMETYPE);
         final Uri oldLookupUri = mLookupUri;
 
+
         if (lookupUri == null) {
             finish();
             return;
@@ -2592,6 +2594,11 @@
                     return;
                 }
 
+                if (!mIsRecreatedInstance && !mShortcutUsageReported) {
+                    mShortcutUsageReported = true;
+                    DynamicShortcuts.reportShortcutUsed(QuickContactActivity.this,
+                            data.getLookupKey());
+                }
                 bindContactData(data);
 
             } finally {