Turning ContactDeletionInteraction into a Fragment

Change-Id: I6edb576d0158b7082d3e2bc4d1902d34fc62cc7a
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 8491e35..533eb85 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -114,7 +114,6 @@
 
     private PhoneNumberInteraction mPhoneNumberCallInteraction;
     private PhoneNumberInteraction mSendTextMessageInteraction;
-    private ContactDeletionInteraction mContactDeletionInteraction;
     private ImportExportInteraction mImportExportInteraction;
 
     private boolean mSearchInitiated;
@@ -578,7 +577,7 @@
 
         @Override
         public void onDeleteContactAction(Uri contactUri) {
-            getContactDeletionInteraction().deleteContact(contactUri);
+            ContactDeletionInteraction.start(ContactBrowserActivity.this, contactUri);
         }
 
         @Override
@@ -617,8 +616,8 @@
         }
 
         @Override
-        public void onDeleteRequested(Uri contactLookupUri) {
-            getContactDeletionInteraction().deleteContact(contactLookupUri);
+        public void onDeleteRequested(Uri contactUri) {
+            ContactDeletionInteraction.start(ContactBrowserActivity.this, contactUri);
         }
 
         @Override
@@ -845,10 +844,7 @@
     protected Dialog onCreateDialog(int id, Bundle bundle) {
         if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, bundle);
 
-        Dialog dialog = getContactDeletionInteraction().onCreateDialog(id, bundle);
-        if (dialog != null) return dialog;
-
-        dialog = getPhoneNumberCallInteraction().onCreateDialog(id, bundle);
+        Dialog dialog = getPhoneNumberCallInteraction().onCreateDialog(id, bundle);
         if (dialog != null) return dialog;
 
         dialog = getSendTextMessageInteraction().onCreateDialog(id, bundle);
@@ -862,10 +858,6 @@
 
     @Override
     protected void onPrepareDialog(int id, Dialog dialog, Bundle bundle) {
-        if (getContactDeletionInteraction().onPrepareDialog(id, dialog, bundle)) {
-            return;
-        }
-
         if (getPhoneNumberCallInteraction().onPrepareDialog(id, dialog, bundle)) {
             return;
         }
@@ -1016,14 +1008,6 @@
         return mSendTextMessageInteraction;
     }
 
-    private ContactDeletionInteraction getContactDeletionInteraction() {
-        if (mContactDeletionInteraction == null) {
-            mContactDeletionInteraction = new ContactDeletionInteraction();
-            mContactDeletionInteraction.attachToActivity(this);
-        }
-        return mContactDeletionInteraction;
-    }
-
     private ImportExportInteraction getImportExportInteraction() {
         if (mImportExportInteraction == null) {
             mImportExportInteraction = new ImportExportInteraction(this);
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index b86eae4..9091328 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -24,7 +24,6 @@
 
 import android.accounts.Account;
 import android.app.Activity;
-import android.app.Dialog;
 import android.content.ActivityNotFoundException;
 import android.content.ContentValues;
 import android.content.Intent;
@@ -40,7 +39,6 @@
     private static final String TAG = "ContactDetailActivity";
 
     private ContactDetailFragment mFragment;
-    private ContactDeletionInteraction mContactDeletionInteraction;
 
     @Override
     public void onCreate(Bundle savedState) {
@@ -57,23 +55,6 @@
     }
 
     @Override
-    protected Dialog onCreateDialog(int id, Bundle args) {
-        final Dialog deletionDialog = getContactDeletionInteraction().onCreateDialog(id, args);
-        if (deletionDialog != null) return deletionDialog;
-
-        // Nobody knows about the Dialog
-        Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args);
-        return null;
-    }
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
-        if (getContactDeletionInteraction().onPrepareDialog(id, dialog, args)) {
-            return;
-        }
-    }
-
-    @Override
     public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
             boolean globalSearch) {
         if (globalSearch) {
@@ -90,14 +71,6 @@
         return super.onKeyDown(keyCode, event);
     }
 
-    private ContactDeletionInteraction getContactDeletionInteraction() {
-        if (mContactDeletionInteraction == null) {
-            mContactDeletionInteraction = new ContactDeletionInteraction();
-            mContactDeletionInteraction.attachToActivity(this);
-        }
-        return mContactDeletionInteraction;
-    }
-
     private final ContactDetailFragment.Listener mFragmentListener =
             new ContactDetailFragment.Listener() {
         @Override
@@ -120,8 +93,8 @@
         }
 
         @Override
-        public void onDeleteRequested(Uri lookupUri) {
-            getContactDeletionInteraction().deleteContact(lookupUri);
+        public void onDeleteRequested(Uri contactUri) {
+            ContactDeletionInteraction.start(ContactDetailActivity.this, contactUri);
         }
 
         @Override
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 2b22b4b..a8df2e0 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -41,7 +41,6 @@
     private static final String TAG = "ContactEditorActivity";
 
     private ContactEditorFragment mFragment;
-    private ContactDeletionInteraction mContactDeletionInteraction;
     private Button mDoneButton;
     private Button mRevertButton;
 
@@ -90,22 +89,12 @@
     protected Dialog onCreateDialog(int id, Bundle args) {
         if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args);
 
-        Dialog dialog = getContactDeletionInteraction().onCreateDialog(id, args);
-        if (dialog != null) return dialog;
-
         // Nobody knows about the Dialog
         Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args);
         return null;
     }
 
     @Override
-    protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
-        if (getContactDeletionInteraction().onPrepareDialog(id, dialog, args)) {
-            return;
-        }
-    }
-
-    @Override
     public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
             boolean globalSearch) {
         if (globalSearch) {
@@ -120,14 +109,6 @@
         mFragment.save(true);
     }
 
-    private ContactDeletionInteraction getContactDeletionInteraction() {
-        if (mContactDeletionInteraction == null) {
-            mContactDeletionInteraction = new ContactDeletionInteraction();
-            mContactDeletionInteraction.attachToActivity(this);
-        }
-        return mContactDeletionInteraction;
-    }
-
     private final ContactEditorFragment.Listener mFragmentListener =
             new ContactEditorFragment.Listener() {
         @Override
@@ -163,8 +144,8 @@
         }
 
         @Override
-        public void onDeleteRequested(Uri lookupUri) {
-            getContactDeletionInteraction().deleteContact(lookupUri);
+        public void onDeleteRequested(Uri contactUri) {
+            ContactDeletionInteraction.start(ContactEditorActivity.this, contactUri);
         }
 
         @Override
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index 4022aba..ca77df3 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -17,42 +17,46 @@
 package com.android.contacts.interactions;
 
 import com.android.contacts.R;
-import com.android.contacts.model.AccountTypes;
 import com.android.contacts.model.AccountType;
+import com.android.contacts.model.AccountTypes;
 import com.google.android.collect.Sets;
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.Dialog;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Context;
 import android.content.CursorLoader;
 import android.content.DialogInterface;
+import android.content.DialogInterface.OnDismissListener;
 import android.content.Loader;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Contacts.Entity;
-import android.provider.ContactsContract.RawContacts;
-import android.util.Log;
 
 import java.util.HashSet;
 
 /**
  * An interaction invoked to delete a contact.
  */
-public class ContactDeletionInteraction {
+public class ContactDeletionInteraction extends Fragment
+        implements LoaderCallbacks<Cursor>, OnDismissListener {
 
-    private static final String TAG = "ContactDeletionInteraction";
+    private static final String FRAGMENT_TAG = "deleteContact";
 
-    public static final String EXTRA_KEY_CONTACT_URI = "contactUri";
-    public static final String EXTRA_KEY_MESSAGE_ID = "messageId";
+    private static final String KEY_ACTIVE = "active";
+    public static final String ARG_CONTACT_URI = "contactUri";
 
-    private static final String[] RAW_CONTACTS_PROJECTION = new String[] {
-        RawContacts._ID, //0
-        RawContacts.ACCOUNT_TYPE, //1
-        Contacts._ID, // 2
-        Contacts.LOOKUP_KEY, // 3
+    private static final int LOADER_ID = 0;
+
+    private static final String[] ENTITY_PROJECTION = new String[] {
+        Entity.RAW_CONTACT_ID, //0
+        Entity.ACCOUNT_TYPE, //1
+        Entity.CONTACT_ID, // 2
+        Entity.LOOKUP_KEY, // 3
     };
 
     private static final int COLUMN_INDEX_RAW_CONTACT_ID = 0;
@@ -60,42 +64,28 @@
     private static final int COLUMN_INDEX_CONTACT_ID = 2;
     private static final int COLUMN_INDEX_LOOKUP_KEY = 3;
 
-    private final class RawContactLoader extends CursorLoader {
-        private final Uri mContactUri;
-
-        private RawContactLoader(Context context, Uri contactUri) {
-            super(context, Uri.withAppendedPath(contactUri, Entity.CONTENT_DIRECTORY),
-                    RAW_CONTACTS_PROJECTION, null, null, null);
-            this.mContactUri = contactUri;
-        }
-
-        @Override
-        public void deliverResult(Cursor data) {
-            if (data == null || data.getCount() == 0) {
-                Log.e(TAG, "No such contact: " + mContactUri);
-                return;
-            }
-
-            showConfirmationDialog(data);
-        }
-    }
-
-    private final class ConfirmationDialogClickListener implements DialogInterface.OnClickListener {
-        private final Uri mContactUri;
-
-        public ConfirmationDialogClickListener(Uri contactUri) {
-            this.mContactUri = contactUri;
-        }
-
-        public void onClick(DialogInterface dialog, int which) {
-            doDeleteContact(mContactUri);
-        }
-    }
-
+    private boolean mActive;
+    private Uri mContactUri;
     private Context mContext;
-    private CursorLoader mLoader;
 
-    public void attachToActivity(Activity activity) {
+    private AlertDialog mDialog;
+
+    public static void start(Activity activity, Uri contactUri) {
+        FragmentManager fragmentManager = activity.getFragmentManager();
+        ContactDeletionInteraction fragment =
+                (ContactDeletionInteraction) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
+        if (fragment == null) {
+            fragment = new ContactDeletionInteraction();
+            fragment.setContactUri(contactUri);
+            fragmentManager.openTransaction().add(fragment, FRAGMENT_TAG).commit();
+        } else {
+            fragment.setContactUri(contactUri);
+        }
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
         setContext(activity);
     }
 
@@ -104,15 +94,50 @@
         mContext = context;
     }
 
-    public void deleteContact(Uri contactUri) {
-        if (mLoader != null) {
-            mLoader.destroy();
+    public void setContactUri(Uri contactUri) {
+        mContactUri = contactUri;
+        mActive = true;
+        if (isStarted()) {
+            Bundle args = new Bundle();
+            args.putParcelable(ARG_CONTACT_URI, mContactUri);
+            getLoaderManager().restartLoader(LOADER_ID, args, this);
         }
-        mLoader = new RawContactLoader(mContext, contactUri);
-        startLoading(mLoader);
     }
 
-    protected void showConfirmationDialog(Cursor cursor) {
+    /* Visible for testing */
+    boolean isStarted() {
+        return isAdded();
+    }
+
+    @Override
+    public void onStart() {
+        if (mActive) {
+            Bundle args = new Bundle();
+            args.putParcelable(ARG_CONTACT_URI, mContactUri);
+            getLoaderManager().initLoader(LOADER_ID, args, this);
+        }
+        super.onStart();
+    }
+
+    @Override
+    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+        Uri contactUri = args.getParcelable(ARG_CONTACT_URI);
+        return new CursorLoader(mContext,
+                Uri.withAppendedPath(contactUri, Entity.CONTENT_DIRECTORY), ENTITY_PROJECTION,
+                null, null, null);
+    }
+
+    @Override
+    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+        if (mDialog != null) {
+            mDialog.dismiss();
+            mDialog = null;
+        }
+
+        if (!mActive) {
+            return;
+        }
+
         long contactId = 0;
         String lookupKey = null;
 
@@ -121,23 +146,20 @@
         HashSet<Long>  writableRawContacts = Sets.newHashSet();
 
         AccountTypes sources = getSources();
-        try {
-            while (cursor.moveToNext()) {
-                final long rawContactId = cursor.getLong(COLUMN_INDEX_RAW_CONTACT_ID);
-                final String accountType = cursor.getString(COLUMN_INDEX_ACCOUNT_TYPE);
-                contactId = cursor.getLong(COLUMN_INDEX_CONTACT_ID);
-                lookupKey = cursor.getString(COLUMN_INDEX_LOOKUP_KEY);
-                AccountType contactsSource = sources.getInflatedSource(accountType,
-                        AccountType.LEVEL_SUMMARY);
-                boolean readonly = contactsSource != null && contactsSource.readOnly;
-                if (readonly) {
-                    readOnlyRawContacts.add(rawContactId);
-                } else {
-                    writableRawContacts.add(rawContactId);
-                }
+        cursor.moveToPosition(-1);
+        while (cursor.moveToNext()) {
+            final long rawContactId = cursor.getLong(COLUMN_INDEX_RAW_CONTACT_ID);
+            final String accountType = cursor.getString(COLUMN_INDEX_ACCOUNT_TYPE);
+            contactId = cursor.getLong(COLUMN_INDEX_CONTACT_ID);
+            lookupKey = cursor.getString(COLUMN_INDEX_LOOKUP_KEY);
+            AccountType contactsSource = sources.getInflatedSource(accountType,
+                    AccountType.LEVEL_SUMMARY);
+            boolean readonly = contactsSource != null && contactsSource.readOnly;
+            if (readonly) {
+                readOnlyRawContacts.add(rawContactId);
+            } else {
+                writableRawContacts.add(rawContactId);
             }
-        } finally {
-            cursor.close();
         }
 
         int messageId;
@@ -153,63 +175,58 @@
             messageId = R.string.deleteConfirmation;
         }
 
-        Bundle bundle = new Bundle();
-        bundle.putParcelable(EXTRA_KEY_CONTACT_URI, Contacts.getLookupUri(contactId, lookupKey));
-        bundle.putInt(EXTRA_KEY_MESSAGE_ID, messageId);
-
-        showDialog(bundle);
-    }
-
-    /**
-     * Creates a delete confirmation dialog and returns it.  Returns null if the
-     * id is not for a deletion confirmation.
-     */
-    public Dialog onCreateDialog(int id, Bundle bundle) {
-        if (id != R.id.dialog_delete_contact_confirmation) {
-            return null;
-        }
-
-        return new AlertDialog.Builder(mContext)
-                .setTitle(R.string.deleteConfirmation_title)
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setMessage(R.string.deleteConfirmation)
-                .setNegativeButton(android.R.string.cancel, null)
-                .setPositiveButton(android.R.string.ok, null)
-                .create();
-    }
-
-    public boolean onPrepareDialog(int id, Dialog dialog, Bundle bundle) {
-        if (id != R.id.dialog_delete_contact_confirmation) {
-            return false;
-        }
-
-        Uri contactUri = bundle.getParcelable(EXTRA_KEY_CONTACT_URI);
-        int messageId = bundle.getInt(EXTRA_KEY_MESSAGE_ID, R.string.deleteConfirmation);
-
-        ((AlertDialog)dialog).setMessage(mContext.getText(messageId));
-        ((AlertDialog)dialog).setButton(DialogInterface.BUTTON_POSITIVE,
-                mContext.getText(android.R.string.ok),
-                new ConfirmationDialogClickListener(contactUri));
-
-        return true;
-    }
-
-    protected void doDeleteContact(Uri contactUri) {
-        mContext.getContentResolver().delete(contactUri, null, null);
+        final Uri contactUri = Contacts.getLookupUri(contactId, lookupKey);
+        showDialog(messageId, contactUri);
     }
 
     /* Visible for testing */
-    void startLoading(Loader<Cursor> loader) {
-        loader.startLoading();
+    void showDialog(int messageId, final Uri contactUri) {
+        mDialog = new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.deleteConfirmation_title)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setMessage(messageId)
+                .setNegativeButton(android.R.string.cancel, null)
+                .setPositiveButton(android.R.string.ok,
+                    new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int whichButton) {
+                            doDeleteContact(contactUri);
+                        }
+                    }
+                )
+                .create();
+
+        mDialog.setOnDismissListener(this);
+        mDialog.show();
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        mActive = false;
+        mDialog = null;
+        getLoaderManager().stopLoader(LOADER_ID);
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(KEY_ACTIVE, mActive);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        if (savedInstanceState != null) {
+            mActive = savedInstanceState.getBoolean(KEY_ACTIVE);
+        }
+    }
+
+    protected void doDeleteContact(Uri contactUri) {
+        getActivity().getContentResolver().delete(contactUri, null, null);
     }
 
     /* Visible for testing */
     AccountTypes getSources() {
-        return AccountTypes.getInstance(mContext);
-    }
-
-    /* Visible for testing */
-    void showDialog(Bundle bundle) {
-        ((Activity)mContext).showDialog(R.id.dialog_delete_contact_confirmation, bundle);
+        return AccountTypes.getInstance(getActivity());
     }
 }
diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
index 65be32e..2ba3852 100644
--- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
+++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java
@@ -19,18 +19,18 @@
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypes;
 import com.android.contacts.tests.mocks.ContactsMockContext;
+import com.android.contacts.tests.mocks.MockAccountTypes;
 import com.android.contacts.tests.mocks.MockContentProvider;
 import com.android.contacts.tests.mocks.MockContentProvider.Query;
-import com.android.contacts.tests.mocks.MockAccountTypes;
+import com.android.contacts.widget.TestLoaderManager;
 
-import android.content.AsyncTaskLoader;
+import android.app.LoaderManager;
 import android.content.ContentUris;
-import android.content.Loader;
-import android.database.Cursor;
+import android.content.pm.ProviderInfo;
 import android.net.Uri;
-import android.os.Bundle;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.Contacts.Entity;
 import android.test.InstrumentationTestCase;
 import android.test.suitebuilder.annotation.Smoke;
 
@@ -47,22 +47,25 @@
 @Smoke
 public class ContactDeletionInteractionTest extends InstrumentationTestCase {
 
-    private final static class TestContactDeletionInteraction extends ContactDeletionInteraction {
+    private final class TestContactDeletionDialogFragment
+            extends ContactDeletionInteraction {
         public Uri contactUri;
         public int messageId;
 
         @Override
-        void startLoading(Loader<Cursor> loader) {
-            // Execute the loader synchronously
-            AsyncTaskLoader<Cursor> atLoader = (AsyncTaskLoader<Cursor>)loader;
-            Cursor data = atLoader.loadInBackground();
-            atLoader.deliverResult(data);
+        public LoaderManager getLoaderManager() {
+            return mLoaderManager;
         }
 
         @Override
-        void showDialog(Bundle bundle) {
-            contactUri = bundle.getParcelable(EXTRA_KEY_CONTACT_URI);
-            messageId = bundle.getInt(EXTRA_KEY_MESSAGE_ID);
+        boolean isStarted() {
+            return true;
+        }
+
+        @Override
+        void showDialog(int messageId, Uri contactUri) {
+            this.messageId = messageId;
+            this.contactUri = contactUri;
         }
 
         @Override
@@ -73,49 +76,56 @@
 
     private ContactsMockContext mContext;
     private MockContentProvider mContactsProvider;
+    private TestLoaderManager mLoaderManager;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mContext = new ContactsMockContext(getInstrumentation().getTargetContext());
         mContactsProvider = mContext.getContactsProvider();
+        ProviderInfo info = new ProviderInfo();
+        info.authority = ContactsContract.AUTHORITY;
+        mContactsProvider.attachInfo(mContext, info);
+        mLoaderManager = new TestLoaderManager();
     }
 
     public void testSingleWritableRawContact() {
-        expectQuery().returnRow(1, MockAccountTypes.WRITABLE_ACCOUNT_TYPE);
+        expectQuery().returnRow(1, MockAccountTypes.WRITABLE_ACCOUNT_TYPE, 13, "foo");
         assertWithMessageId(R.string.deleteConfirmation);
     }
 
     public void testReadOnlyRawContacts() {
-        expectQuery().returnRow(1, MockAccountTypes.READONLY_ACCOUNT_TYPE);
+        expectQuery().returnRow(1, MockAccountTypes.READONLY_ACCOUNT_TYPE, 13, "foo");
         assertWithMessageId(R.string.readOnlyContactWarning);
     }
 
     public void testMixOfWritableAndReadOnlyRawContacts() {
         expectQuery()
-                .returnRow(1, MockAccountTypes.WRITABLE_ACCOUNT_TYPE)
-                .returnRow(2, MockAccountTypes.READONLY_ACCOUNT_TYPE);
+                .returnRow(1, MockAccountTypes.WRITABLE_ACCOUNT_TYPE, 13, "foo")
+                .returnRow(2, MockAccountTypes.READONLY_ACCOUNT_TYPE, 13, "foo");
         assertWithMessageId(R.string.readOnlyContactDeleteConfirmation);
     }
 
     public void testMultipleWritableRawContacts() {
         expectQuery()
-                .returnRow(1, MockAccountTypes.WRITABLE_ACCOUNT_TYPE)
-                .returnRow(2, MockAccountTypes.WRITABLE_ACCOUNT_TYPE);
+                .returnRow(1, MockAccountTypes.WRITABLE_ACCOUNT_TYPE, 13, "foo")
+                .returnRow(2, MockAccountTypes.WRITABLE_ACCOUNT_TYPE, 13, "foo");
         assertWithMessageId(R.string.multipleContactDeleteConfirmation);
     }
 
     private Query expectQuery() {
-        return mContactsProvider.expectQuery(RawContacts.CONTENT_URI)
-                .withProjection(RawContacts._ID, RawContacts.ACCOUNT_TYPE)
-                .withSelection("contact_id=?", "13");
+        Uri uri = Uri.withAppendedPath(
+                ContentUris.withAppendedId(Contacts.CONTENT_URI, 13), Entity.CONTENT_DIRECTORY);
+        return mContactsProvider.expectQuery(uri).withProjection(
+                Entity.RAW_CONTACT_ID, Entity.ACCOUNT_TYPE, Entity.CONTACT_ID, Entity.LOOKUP_KEY);
     }
 
     private void assertWithMessageId(int messageId) {
-        TestContactDeletionInteraction interaction = new TestContactDeletionInteraction();
+        TestContactDeletionDialogFragment interaction = new TestContactDeletionDialogFragment();
         interaction.setContext(mContext);
-        interaction.deleteContact(ContentUris.withAppendedId(Contacts.CONTENT_URI, 13));
-        assertEquals("content://com.android.contacts/contacts/13",
+        interaction.setContactUri(ContentUris.withAppendedId(Contacts.CONTENT_URI, 13));
+        mLoaderManager.executeLoaders();
+        assertEquals("content://com.android.contacts/contacts/lookup/foo/13",
                 interaction.contactUri.toString());
         assertEquals(messageId, interaction.messageId);
         mContactsProvider.verify();