Avoid senseless disambiguation #2/2

This makes having two contacts apps on the same
device tolerable.

Bug: 18777272
Change-Id: Ib75eadfb94eee2c5c8305747eddd01ba9a8b1dc4
diff --git a/src/com/android/contacts/NonPhoneActivity.java b/src/com/android/contacts/NonPhoneActivity.java
index 652620c..8ae96a2 100644
--- a/src/com/android/contacts/NonPhoneActivity.java
+++ b/src/com/android/contacts/NonPhoneActivity.java
@@ -16,6 +16,8 @@
 
 package com.android.contacts;
 
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -85,7 +87,7 @@
                 final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
                 intent.setType(Contacts.CONTENT_ITEM_TYPE);
                 intent.putExtra(Insert.PHONE, getArgumentPhoneNumber());
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
             }
             dismiss();
         }
diff --git a/src/com/android/contacts/activities/ContactEditorBaseActivity.java b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
index 7cf4298..e4e9049 100644
--- a/src/com/android/contacts/activities/ContactEditorBaseActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorBaseActivity.java
@@ -22,6 +22,7 @@
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.editor.ContactEditorBaseFragment;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.interactions.ContactDeletionInteraction;
@@ -261,7 +262,8 @@
             if (mFinishActivityOnSaveCompleted) {
                 setResult(resultIntent == null ? RESULT_CANCELED : RESULT_OK, resultIntent);
             } else if (resultIntent != null) {
-                startActivity(resultIntent);
+                ImplicitIntentsUtil.startActivityInApp(ContactEditorBaseActivity.this,
+                        resultIntent);
             }
             finish();
         }
@@ -289,7 +291,7 @@
                 intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, values);
             }
 
-            startActivity(intent);
+            ImplicitIntentsUtil.startActivityInApp(ContactEditorBaseActivity.this, intent);
             finish();
         }
 
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 8477a95..0ba6e3a 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -45,6 +45,7 @@
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
 import com.android.contacts.common.list.ContactEntryListFragment;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.list.ContactPickerFragment;
 import com.android.contacts.list.ContactsIntentResolver;
 import com.android.contacts.list.ContactsRequest;
@@ -118,14 +119,6 @@
             return;
         }
 
-        Intent redirect = mRequest.getRedirectIntent();
-        if (redirect != null) {
-            // Need to start a different activity
-            startActivity(redirect);
-            finish();
-            return;
-        }
-
         configureActivityTitle();
 
         setContentView(R.layout.contact_picker);
@@ -650,7 +643,7 @@
         if (requestCode == SUBACTIVITY_ADD_TO_EXISTING_CONTACT) {
             if (resultCode == Activity.RESULT_OK) {
                 if (data != null) {
-                    startActivity(data);
+                    ImplicitIntentsUtil.startActivityInAppIfPossible(this, data);
                 }
                 finish();
             }
diff --git a/src/com/android/contacts/activities/GroupDetailActivity.java b/src/com/android/contacts/activities/GroupDetailActivity.java
index c24a42f..394e5e5 100644
--- a/src/com/android/contacts/activities/GroupDetailActivity.java
+++ b/src/com/android/contacts/activities/GroupDetailActivity.java
@@ -31,6 +31,7 @@
 
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.group.GroupDetailDisplayUtils;
 import com.android.contacts.group.GroupDetailFragment;
 import com.android.contacts.common.model.AccountTypeManager;
@@ -106,7 +107,7 @@
         @Override
         public void onContactSelected(Uri contactUri) {
             Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
-            startActivity(intent);
+            ImplicitIntentsUtil.startActivityInApp(GroupDetailActivity.this, intent);
         }
 
     };
@@ -149,7 +150,7 @@
                 final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                 intent.setClassName(accountType.syncAdapterPackageName,
                         accountType.getViewGroupActivity());
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityInApp(GroupDetailActivity.this, intent);
             }
         });
         groupSourceMenuItem.setActionView(groupSourceView);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 09ef09f..33e92e9 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -31,7 +31,6 @@
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.ProviderStatus;
-import android.provider.ContactsContract.QuickContact;
 import android.provider.Settings;
 import android.support.v13.app.FragmentPagerAdapter;
 import android.support.v4.view.PagerAdapter;
@@ -55,6 +54,7 @@
 import com.android.contacts.activities.ActionBarAdapter.TabState;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.dialog.ClearFrequentsDialog;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.common.interactions.ImportExportDialogFragment;
 import com.android.contacts.common.list.ContactEntryListFragment;
@@ -267,18 +267,10 @@
             return false;
         }
 
-        Intent redirect = mRequest.getRedirectIntent();
-        if (redirect != null) {
-            // Need to start a different activity
-            startActivity(redirect);
-            return false;
-        }
-
         if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT) {
-            redirect = new Intent(this, QuickContactActivity.class);
-            redirect.setAction(Intent.ACTION_VIEW);
-            redirect.setData(mRequest.getContactUri());
-            startActivity(redirect);
+            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(
+                    mRequest.getContactUri(), QuickContactActivity.MODE_FULLY_EXPANDED);
+            ImplicitIntentsUtil.startActivityInApp(this, intent);
             return false;
         }
         return true;
@@ -894,8 +886,9 @@
 
         @Override
         public void onViewContactAction(Uri contactLookupUri) {
-            QuickContact.showQuickContact(PeopleActivity.this, (Rect) null, contactLookupUri,
-                    QuickContactActivity.MODE_FULLY_EXPANDED, null);
+            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(contactLookupUri,
+                    QuickContactActivity.MODE_FULLY_EXPANDED);
+            ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
         }
 
         @Override
@@ -932,7 +925,8 @@
 
         @Override
         public void onCreateNewContactAction() {
-            startActivity(new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
+            ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this,
+                    new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));
         }
 
         @Override
@@ -940,8 +934,8 @@
             Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
             intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
             intent.putExtra(Settings.EXTRA_AUTHORITIES,
-                    new String[] { ContactsContract.AUTHORITY });
-            startActivity(intent);
+                    new String[]{ContactsContract.AUTHORITY});
+            ImplicitIntentsUtil.startActivityOutsideApp(PeopleActivity.this, intent);
         }
 
         @Override
@@ -957,8 +951,9 @@
 
         @Override
         public void onContactSelected(Uri contactUri, Rect targetRect) {
-            QuickContact.showQuickContact(PeopleActivity.this, targetRect, contactUri,
-                    QuickContactActivity.MODE_FULLY_EXPANDED, null);
+            final Intent intent = ImplicitIntentsUtil.composeQuickContactIntent(contactUri,
+                    QuickContactActivity.MODE_FULLY_EXPANDED);
+            ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
         }
 
         @Override
@@ -1116,13 +1111,13 @@
                     ContactsContract.AUTHORITY
                 });
                 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityInAppIfPossible(this, intent);
                 return true;
             }
             case R.id.export_database: {
                 final Intent intent = new Intent("com.android.providers.contacts.DUMP_DATABASE");
                 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
                 return true;
             }
         }
@@ -1263,7 +1258,7 @@
                     intent.putExtras(extras);
                 }
                 try {
-                    startActivity(intent);
+                    ImplicitIntentsUtil.startActivityInApp(PeopleActivity.this, intent);
                 } catch (ActivityNotFoundException ex) {
                     Toast.makeText(PeopleActivity.this, R.string.missing_app,
                             Toast.LENGTH_SHORT).show();
diff --git a/src/com/android/contacts/activities/ShowOrCreateActivity.java b/src/com/android/contacts/activities/ShowOrCreateActivity.java
index 0489065..da5bb9d 100755
--- a/src/com/android/contacts/activities/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/activities/ShowOrCreateActivity.java
@@ -36,6 +36,7 @@
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.util.NotifyingAsyncQueryHandler;
 
 /**
@@ -173,7 +174,7 @@
             // If we only found one item, jump right to viewing it
             final Uri contactUri = Contacts.getLookupUri(contactId, lookupKey);
             final Intent viewIntent = new Intent(Intent.ACTION_VIEW, contactUri);
-            startActivity(viewIntent);
+            ImplicitIntentsUtil.startActivityInApp(this, viewIntent);
             finish();
 
         } else if (count > 1) {
@@ -192,7 +193,7 @@
                 createIntent.putExtras(mCreateExtras);
                 createIntent.setType(RawContacts.CONTENT_TYPE);
 
-                startActivity(createIntent);
+                ImplicitIntentsUtil.startActivityInApp(this, createIntent);
                 finish();
 
             } else {
@@ -249,7 +250,7 @@
 
         public void onClick(DialogInterface dialog, int which) {
             if (mIntent != null) {
-                mParent.startActivity(mIntent);
+                ImplicitIntentsUtil.startActivityInApp(mParent, mIntent);
             }
             mParent.finish();
         }
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index 03ac880..1d3fbee 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -36,6 +36,7 @@
 import com.android.contacts.common.model.ValuesDelta;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.editor.AggregationSuggestionEngine.Suggestion;
 import com.android.contacts.list.UiIntentActions;
 import com.android.contacts.quickcontact.QuickContactActivity;
@@ -1275,7 +1276,8 @@
                 if (saveSucceeded && contactLookupUri != null) {
                     final Uri lookupUri = maybeConvertToLegacyLookupUri(
                             mContext, contactLookupUri, mLookupUri);
-                    resultIntent = composeQuickContactsIntent(lookupUri);
+                    resultIntent = ImplicitIntentsUtil.composeQuickContactIntent(lookupUri,
+                            QuickContactActivity.MODE_FULLY_EXPANDED);
                 } else {
                     resultIntent = null;
                 }
@@ -1535,17 +1537,4 @@
         // Otherwise pass back a lookup-style Uri
         return contactLookupUri;
     }
-
-    /**
-     * Creates the result Intent for the given contactLookupUri that should started after a
-     * successful saving a contact.
-     */
-    protected static Intent composeQuickContactsIntent(Uri contactLookupUri) {
-        final Intent intent = new Intent(QuickContact.ACTION_QUICK_CONTACT);
-        intent.setData(contactLookupUri);
-        intent.putExtra(QuickContact.EXTRA_MODE, QuickContactActivity.MODE_FULLY_EXPANDED);
-        // Make sure not to show QuickContacts on top of another QuickContacts.
-        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        return intent;
-    }
 }
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index 81cc28c..d39501a 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -44,6 +44,7 @@
 
 import com.android.contacts.GroupListLoader;
 import com.android.contacts.R;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.group.GroupBrowseListAdapter.GroupListItemViewCache;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.list.AutoScrollListView;
@@ -141,7 +142,7 @@
                 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
                 intent.putExtra(Settings.EXTRA_AUTHORITIES,
                         new String[] { ContactsContract.AUTHORITY });
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
             }
         });
         setAddAccountsVisibility(!ContactsUtils.areGroupWritableAccountsAvailable(mContext));
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index c12595d..c9cf6bd 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -51,6 +51,7 @@
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
 import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.interactions.GroupDeletionDialogFragment;
 import com.android.contacts.common.list.ContactTileAdapter;
 import com.android.contacts.common.list.ContactTileView;
@@ -398,7 +399,7 @@
                     intent.setClassName(accountType.syncAdapterPackageName,
                             accountType.getViewGroupActivity());
                     try {
-                        startActivity(intent);
+                        ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
                     } catch (ActivityNotFoundException e) {
                         Log.e(TAG, "startActivity() failed: " + e);
                         Toast.makeText(getActivity(), R.string.missing_app,
diff --git a/src/com/android/contacts/list/ContactsRequest.java b/src/com/android/contacts/list/ContactsRequest.java
index 68b06fa..636fe58 100644
--- a/src/com/android/contacts/list/ContactsRequest.java
+++ b/src/com/android/contacts/list/ContactsRequest.java
@@ -82,7 +82,6 @@
 
     private boolean mValid = true;
     private int mActionCode = ACTION_DEFAULT;
-    private Intent mRedirectIntent;
     private CharSequence mTitle;
     private boolean mSearchMode;
     private String mQueryString;
@@ -95,7 +94,6 @@
     public String toString() {
         return "{ContactsRequest:mValid=" + mValid
                 + " mActionCode=" + mActionCode
-                + " mRedirectIntent=" + mRedirectIntent
                 + " mTitle=" + mTitle
                 + " mSearchMode=" + mSearchMode
                 + " mQueryString=" + mQueryString
@@ -114,14 +112,6 @@
         mValid = flag;
     }
 
-    public Intent getRedirectIntent() {
-        return mRedirectIntent;
-    }
-
-    public void setRedirectIntent(Intent intent) {
-        mRedirectIntent = intent;
-    }
-
     public void setActivityTitle(CharSequence title) {
         mTitle = title;
     }
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index 4630202..fefe28b 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -39,6 +39,7 @@
 import com.android.contacts.common.list.ContactListItemView;
 import com.android.contacts.common.list.DefaultContactListAdapter;
 import com.android.contacts.common.list.ProfileAndContactsLoader;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.common.util.AccountFilterUtil;
 
@@ -251,7 +252,7 @@
             public void onClick(View v) {
                 Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);
                 intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, true);
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
             }
         });
     }
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 8968939..bec1568 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -121,6 +121,7 @@
 import com.android.contacts.common.model.dataitem.StructuredNameDataItem;
 import com.android.contacts.common.model.dataitem.StructuredPostalDataItem;
 import com.android.contacts.common.model.dataitem.WebsiteDataItem;
+import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.util.DateUtils;
 import com.android.contacts.common.util.MaterialColorMapUtils;
 import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
@@ -377,7 +378,7 @@
 
             mHasIntentLaunched = true;
             try {
-                startActivity(intent);
+                ImplicitIntentsUtil.startActivityInAppIfPossible(QuickContactActivity.this, intent);
             } catch (SecurityException ex) {
                 Toast.makeText(QuickContactActivity.this, R.string.missing_app,
                         Toast.LENGTH_SHORT).show();
@@ -2148,6 +2149,7 @@
 
     private Intent getEditContactIntent() {
         final Intent intent = new Intent(Intent.ACTION_EDIT, mContactData.getLookupUri());
+        intent.setPackage(this.getPackageName());
         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
         return intent;
     }
@@ -2229,7 +2231,7 @@
 
         try {
             mHasIntentLaunched = true;
-            this.startActivity(chooseIntent);
+            ImplicitIntentsUtil.startActivityOutsideApp(this, intent);
         } catch (final ActivityNotFoundException ex) {
             Toast.makeText(this, R.string.share_error, Toast.LENGTH_SHORT).show();
         }
diff --git a/src/com/android/contacts/quickcontact/QuickContactBroadcastReceiver.java b/src/com/android/contacts/quickcontact/QuickContactBroadcastReceiver.java
index e0850d7..dae10af 100644
--- a/src/com/android/contacts/quickcontact/QuickContactBroadcastReceiver.java
+++ b/src/com/android/contacts/quickcontact/QuickContactBroadcastReceiver.java
@@ -16,6 +16,8 @@
 
 package com.android.contacts.quickcontact;
 
+import com.android.contacts.common.util.ImplicitIntentsUtil;
+
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -35,6 +37,6 @@
         newIntent.setSourceBounds(intent.getSourceBounds());
         newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         newIntent.setData(dataUri);
-        context.startActivity(newIntent);
+        ImplicitIntentsUtil.startActivityInApp(context, newIntent);
     }
 }