Send broadcast to request high res photo sync

For GoogleAccountTypes don't start the service to notify the
adapter that the contact was viewed. Instead send a broadcast
to request a high res photo sync.
Fallback to original code path if there are no receivers.

Test: Manual test with debug logging enabled. Viewing a low res
photo synced the high res photo after the broadcast was received
and the job intent service was run.
Tested on Q build: QP1A.190430.002

Bug:131899328
Change-Id: I85212d6173567a305868a631a610f003b8cbc7a7
Merged-In: I85212d6173567a305868a631a610f003b8cbc7a7
diff --git a/src/com/android/contacts/model/ContactLoader.java b/src/com/android/contacts/model/ContactLoader.java
index acb8212..af46fc2 100644
--- a/src/com/android/contacts/model/ContactLoader.java
+++ b/src/com/android/contacts/model/ContactLoader.java
@@ -24,6 +24,7 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
 import android.database.Cursor;
@@ -44,6 +45,7 @@
 import com.android.contacts.group.GroupMetaData;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountTypeWithDataSet;
+import com.android.contacts.model.account.GoogleAccountType;
 import com.android.contacts.model.dataitem.DataItem;
 import com.android.contacts.model.dataitem.PhoneDataItem;
 import com.android.contacts.model.dataitem.PhotoDataItem;
@@ -895,13 +897,34 @@
             mNotifiedRawContactIds.add(rawContactId);
             final AccountType accountType = rawContact.getAccountType(context);
             final String serviceName = accountType.getViewContactNotifyServiceClassName();
-            final String servicePackageName = accountType.getViewContactNotifyServicePackageName();
+            final String servicePackageName = accountType
+                .getViewContactNotifyServicePackageName();
             if (!TextUtils.isEmpty(serviceName) && !TextUtils.isEmpty(servicePackageName)) {
                 final Uri uri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
                 final Intent intent = new Intent();
+                intent.setDataAndType(uri, RawContacts.CONTENT_ITEM_TYPE);
+                if (accountType instanceof GoogleAccountType) {
+                    intent.setPackage(servicePackageName);
+                    intent
+                        .setAction("com.google.android.syncadapters.contacts.SYNC_HIGH_RES_PHOTO");
+                    List<ResolveInfo> broadcastReceivers =
+                        context.getPackageManager().queryBroadcastReceivers(intent, 0);
+                    if (!broadcastReceivers.isEmpty()) {
+                        if (Log.isLoggable(TAG, Log.DEBUG)) {
+                            for (ResolveInfo broadcastReceiver : broadcastReceivers) {
+                                Log.d(TAG, broadcastReceiver.activityInfo.toString());
+                            }
+                        }
+                        context.sendBroadcast(intent);
+                        continue;
+                    }
+                }
+                // TODO: Social Stream API is deprecated, and once the opted-in
+                // sync adapters target Android O+, we won't be able to start their services
+                // since they'll likely be in the background, so we'll need to remove the
+                // startService call.
                 intent.setClassName(servicePackageName, serviceName);
                 intent.setAction(Intent.ACTION_VIEW);
-                intent.setDataAndType(uri, RawContacts.CONTENT_ITEM_TYPE);
                 try {
                     context.startService(intent);
                 } catch (Exception e) {