am 8d0847ca: Polish call blocking rotation/undo behaviors.

* commit '8d0847ca13ca46730756e1d3a3dff3d7d27fd18b':
  Polish call blocking rotation/undo behaviors.
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 696168a..654a96f 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -71,8 +71,7 @@
  */
 public class CallDetailActivity extends AppCompatActivity
         implements MenuItem.OnMenuItemClickListener, View.OnClickListener,
-                FilterNumberDialogFragment.OnBlockListener,
-                FilterNumberDialogFragment.OnUndoBlockListener {
+                FilterNumberDialogFragment.Callback {
     private static final String TAG = CallDetailActivity.class.getSimpleName();
 
      /** A long array extra containing ids of call log entries to display. */
@@ -305,16 +304,6 @@
     }
 
     @Override
-    public void onBlockComplete(Uri uri) {
-        updateBlockActionItem();
-    }
-
-    @Override
-    public void onUndoBlockComplete() {
-        updateBlockActionItem();
-    }
-
-    @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
             TouchPointManager.getInstance().setPoint((int) ev.getRawX(), (int) ev.getRawY());
@@ -406,17 +395,15 @@
     public void onClick(View view) {
         switch(view.getId()) {
             case R.id.call_detail_action_block:
-                // TODO: Use helper, this code is repeated in several places.
-                FilterNumberDialogFragment newFragment =
-                        FilterNumberDialogFragment.newInstance(
-                                mBlockedNumberId, null, mNumber, null, mDisplayNumber);
-                // TODO: Cleanup this listener pattern. This only works correctly for undoing
-                // blocking, not undoing unblocking.
-                newFragment.setOnBlockListener(this);
-                newFragment.setOnUndoBlockListener(this);
-                newFragment.setParentView(findViewById(R.id.call_detail));
-                newFragment.show(
-                        getFragmentManager(), FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+                FilterNumberDialogFragment.show(
+                        mBlockedNumberId,
+                        null /* normalizedNumber */,
+                        mNumber,
+                        null /* countryIso */,
+                        mDisplayNumber,
+                        R.id.call_detail,
+                        getFragmentManager(),
+                        this);
                 break;
             case R.id.call_detail_action_copy:
                 ClipboardUtils.copyText(mContext, null, mNumber, true);
@@ -431,6 +418,16 @@
         }
     }
 
+    @Override
+    public void onChangeFilteredNumberSuccess() {
+        updateBlockActionItem();
+    }
+
+    @Override
+    public void onChangeFilteredNumberUndo() {
+        updateBlockActionItem();
+    }
+
     private void updateBlockActionItem() {
         if (mDetails == null) {
             return;
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 0353170..7f3a779 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -47,6 +47,7 @@
 import com.android.dialer.contactinfo.NumberWithCountryIso;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.filterednumber.FilterNumberDialogFragment;
 import com.android.dialer.util.PhoneNumberUtil;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
 
@@ -60,7 +61,8 @@
  */
 public class CallLogAdapter extends GroupingListAdapter
         implements CallLogGroupBuilder.GroupCreator,
-                VoicemailPlaybackPresenter.OnVoicemailDeletedListener {
+                VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
+                FilterNumberDialogFragment.Callback {
 
     /** Interface used to initiate a refresh of the content. */
     public interface CallFetcher {
@@ -352,7 +354,8 @@
                 mTelecomCallLogCache,
                 mCallLogListItemHelper,
                 mVoicemailPlaybackPresenter,
-                mFilteredNumberAsyncQueryHandler);
+                mFilteredNumberAsyncQueryHandler,
+                this);
 
         viewHolder.callLogEntryView.setTag(viewHolder);
         viewHolder.callLogEntryView.setAccessibilityDelegate(mAccessibilityDelegate);
@@ -627,6 +630,18 @@
         }
     }
 
+    @Override
+    public void onChangeFilteredNumberSuccess() {
+        mBlockedIdCache.clear();
+        notifyDataSetChanged();
+    }
+
+    @Override
+    public void onChangeFilteredNumberUndo() {
+        mBlockedIdCache.clear();
+        notifyDataSetChanged();
+    }
+
     /**
      * Retrieves the day group of the previous call in the call log.  Used to determine if the day
      * group has changed and to trigger display of the day group text.
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index b70ea07..8f2f4ba 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -61,7 +61,7 @@
  */
 public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
         implements View.OnClickListener, MenuItem.OnMenuItemClickListener,
-        View.OnCreateContextMenuListener {
+                View.OnCreateContextMenuListener {
 
     /** The root view of the call log list item */
     public final View rootView;
@@ -182,6 +182,7 @@
     private final CallLogListItemHelper mCallLogListItemHelper;
     private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
     private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+    private final FilterNumberDialogFragment.Callback mFilteredNumberDialogCallback;
 
     private final int mPhotoSize;
 
@@ -195,6 +196,7 @@
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
             FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
+            FilterNumberDialogFragment.Callback filteredNumberDialogCallback,
             View rootView,
             QuickContactBadge quickContactView,
             View primaryActionView,
@@ -210,6 +212,7 @@
         mCallLogListItemHelper = callLogListItemHelper;
         mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
         mFilteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
+        mFilteredNumberDialogCallback = filteredNumberDialogCallback;
 
         this.rootView = rootView;
         this.quickContactView = quickContactView;
@@ -226,6 +229,7 @@
         phoneCallDetailsViews.nameView.setElegantTextHeight(false);
         phoneCallDetailsViews.callLocationAndDate.setElegantTextHeight(false);
 
+        quickContactView.setOverlay(null);
         quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
 
         primaryActionButtonView.setOnClickListener(this);
@@ -240,7 +244,8 @@
             TelecomCallLogCache telecomCallLogCache,
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
-            FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) {
+            FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
+            FilterNumberDialogFragment.Callback filteredNumberDialogCallback) {
 
         return new CallLogListItemViewHolder(
                 context,
@@ -249,6 +254,7 @@
                 callLogListItemHelper,
                 voicemailPlaybackPresenter,
                 filteredNumberAsyncQueryHandler,
+                filteredNumberDialogCallback,
                 view,
                 (QuickContactBadge) view.findViewById(R.id.quick_contact_photo),
                 view.findViewById(R.id.primary_action_view),
@@ -317,13 +323,15 @@
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.context_menu_block_number:
-                FilterNumberDialogFragment newFragment =
-                        FilterNumberDialogFragment.newInstance(blockId, info.normalizedNumber,
-                                number, countryIso, displayNumber);
-                newFragment.setParentView(
-                        ((Activity) mContext).findViewById(R.id.floating_action_button_container));
-                newFragment.show(((Activity) mContext).getFragmentManager(),
-                        FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+                FilterNumberDialogFragment.show(
+                        blockId,
+                        info.normalizedNumber,
+                        number,
+                        countryIso,
+                        displayNumber,
+                        R.id.floating_action_button_container,
+                        ((Activity) mContext).getFragmentManager(),
+                        mFilteredNumberDialogCallback);
                 return true;
             case R.id.context_menu_copy_to_clipboard:
                 ClipboardUtils.copyText(mContext, null, number, true);
@@ -542,7 +550,6 @@
     }
 
     public void updatePhoto() {
-        quickContactView.setOverlay(null);
         quickContactView.assignContactUri(info.lookupUri);
 
         if (blockId != null) {
@@ -617,6 +624,7 @@
                 new CallLogListItemHelper(phoneCallDetailsHelper, resources, telecomCallLogCache),
                 null /* voicemailPlaybackPresenter */,
                 null /* filteredNumberAsyncQueryHandler */,
+                null /* filteredNumberDialogCallback */,
                 new View(context),
                 new QuickContactBadge(context),
                 new View(context),
diff --git a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java b/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
index ad61a32..1f5ecd6 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
@@ -81,13 +81,15 @@
         deleteNumber.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                FilterNumberDialogFragment newFragment =
-                        FilterNumberDialogFragment.newInstance(id, normalizedNumber, number,
-                                countryIso, displayNumber);
-                newFragment.setParentView(
-                        ((Activity) mContext).findViewById(R.id.blocked_number_fragment));
-                newFragment.show(((Activity) mContext).getFragmentManager(),
-                        FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+                FilterNumberDialogFragment.show(
+                        id,
+                        normalizedNumber,
+                        number,
+                        countryIso,
+                        displayNumber,
+                        R.id.blocked_number_fragment,
+                        ((Activity) mContext).getFragmentManager(),
+                        null /* callback */);
             }
         });
 
diff --git a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java b/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
index 69039c8..a1260ee 100644
--- a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
+++ b/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
@@ -19,6 +19,7 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
+import android.app.FragmentManager;
 import android.content.ContentValues;
 import android.content.DialogInterface;
 import android.content.res.Resources;
@@ -33,53 +34,65 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
 
 public class FilterNumberDialogFragment extends DialogFragment {
-    public static final String BLOCK_DIALOG_FRAGMENT = "blockUnblockNumberDialog";
+
+    /**
+     * Use a callback interface to update UI after success/undo. Favor this approach over other
+     * more standard paradigms because of the variety of scenarios in which the DialogFragment
+     * can be invoked (by an Activity, by a fragment, by an adapter, by an adapter list item).
+     * Because of this, we do NOT support retaining state on rotation, and will dismiss the dialog
+     * upon rotation instead.
+     */
+    public interface Callback {
+        public void onChangeFilteredNumberSuccess();
+        public void onChangeFilteredNumberUndo();
+    }
+
+    private static final String BLOCK_DIALOG_FRAGMENT = "blockUnblockNumberDialog";
 
     private static final String ARG_BLOCK_ID = "argBlockId";
     private static final String ARG_NORMALIZED_NUMBER = "argNormalizedNumber";
     private static final String ARG_NUMBER = "argNumber";
     private static final String ARG_COUNTRY_ISO = "argCountryIso";
     private static final String ARG_DISPLAY_NUMBER = "argDisplayNumber";
+    private static final String ARG_PARENT_VIEW_ID = "parentViewId";
+
+    private String mDisplayNumber;
 
     private FilteredNumberAsyncQueryHandler mHandler;
     private View mParentView;
-    private OnBlockListener mOnBlockListener;
-    private OnUndoBlockListener mOnUndoBlockListener;
+    private Callback mCallback;
 
-    public interface OnBlockListener {
-        /**
-         * Invoked after inserting a blocked number.
-         * @param uri The uri of the newly created row.
-         */
-        public void onBlockComplete(Uri uri);
+    public static void show(
+            Integer blockId,
+            String normalizedNumber,
+            String number,
+            String countryIso,
+            String displayNumber,
+            Integer parentViewId,
+            FragmentManager fragmentManager,
+            Callback callback) {
+        final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment.newInstance(
+                blockId, normalizedNumber, number, countryIso, displayNumber, parentViewId);
+
+        newFragment.setCallback(callback);
+        newFragment.show(fragmentManager, FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
     }
 
-    public interface OnUndoBlockListener {
-        /**
-         * Invoked on undoing the blocking of a number.
-         */
-        public void onUndoBlockComplete();
-    }
-
-    public void setParentView(View view) {
-        mParentView = view;
-    }
-
-    public void setOnBlockListener(OnBlockListener listener) {
-        mOnBlockListener = listener;
-    }
-
-    public void setOnUndoBlockListener(OnUndoBlockListener listener) {
-        mOnUndoBlockListener = listener;
-    }
-
-    public static FilterNumberDialogFragment newInstance(Integer blockId, String normalizedNumber,
-        String number, String countryIso, String displayNumber) {
+    private static FilterNumberDialogFragment newInstance(
+            Integer blockId,
+            String normalizedNumber,
+            String number,
+            String countryIso,
+            String displayNumber,
+            Integer parentViewId) {
         final FilterNumberDialogFragment fragment = new FilterNumberDialogFragment();
         final Bundle args = new Bundle();
         if (blockId != null) {
             args.putInt(ARG_BLOCK_ID, blockId.intValue());
         }
+        if (parentViewId != null) {
+            args.putInt(ARG_PARENT_VIEW_ID, parentViewId.intValue());
+        }
         args.putString(ARG_NORMALIZED_NUMBER, normalizedNumber);
         args.putString(ARG_NUMBER, number);
         args.putString(ARG_COUNTRY_ISO, countryIso);
@@ -92,17 +105,18 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         super.onCreateDialog(savedInstanceState);
         final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
-        final String displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
+        mDisplayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
 
         mHandler = new FilteredNumberAsyncQueryHandler(getContext().getContentResolver());
+        mParentView = getActivity().findViewById(getArguments().getInt(ARG_PARENT_VIEW_ID));
 
         String message;
         String okText;
         if (isBlocked) {
-            message = getString(R.string.unblockNumberConfirmation, displayNumber);
+            message = getString(R.string.unblockNumberConfirmation, mDisplayNumber);
             okText = getString(R.string.unblockNumberOk);
         } else {
-            message = getString(R.string.blockNumberConfirmation, displayNumber);
+            message = getString(R.string.blockNumberConfirmation, mDisplayNumber);
             okText = getString(R.string.blockNumberOk);
         }
 
@@ -122,80 +136,101 @@
     }
 
     @Override
-    public void onDestroy() {
-        this.dismissAllowingStateLoss();
-        super.onDestroy();
+    public void onPause() {
+        // Dismiss on rotation.
+        dismiss();
+        mCallback = null;
+
+        super.onPause();
     }
 
-    private String getBlockedMessage(String displayNumber) {
-        return getString(R.string.snackbar_number_blocked, displayNumber);
+    public void setCallback(Callback callback) {
+        mCallback = callback;
     }
 
-    private String getUnblockedMessage(String displayNumber) {
-        return getString(R.string.snackbar_number_unblocked, displayNumber);
+    private String getBlockedMessage() {
+        return getString(R.string.snackbar_number_blocked, mDisplayNumber);
+    }
+
+    private String getUnblockedMessage() {
+        return getString(R.string.snackbar_number_unblocked, mDisplayNumber);
     }
 
     private void blockNumber() {
-        final String displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
-        final String message = getBlockedMessage(displayNumber);
-        final String undoMessage = getUnblockedMessage(displayNumber);
+        final String message = getBlockedMessage();
+        final String undoMessage = getUnblockedMessage();
+
         final OnUnblockNumberListener onUndoListener = new OnUnblockNumberListener() {
             @Override
             public void onUnblockComplete(int rows, ContentValues values) {
                 Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
-                if (mOnUndoBlockListener != null) {
-                    mOnUndoBlockListener.onUndoBlockComplete();
+                if (mCallback != null) {
+                    mCallback.onChangeFilteredNumberUndo();
                 }
             }
         };
+
         final OnBlockNumberListener onBlockNumberListener = new OnBlockNumberListener() {
             @Override
             public void onBlockComplete(final Uri uri) {
+                final View.OnClickListener undoListener = new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        // Delete the newly created row on 'undo'.
+                        mHandler.unblock(onUndoListener, uri);
+                    }
+                };
+
                 Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
-                        .setAction(R.string.block_number_undo,
-                                // Delete the newly created row on 'undo'.
-                                new View.OnClickListener() {
-                                    @Override
-                                    public void onClick(View view) {
-                                        mHandler.unblock(onUndoListener, uri);
-                                    }
-                                })
+                        .setAction(R.string.block_number_undo, undoListener)
                         .show();
-                if (mOnBlockListener != null) {
-                    mOnBlockListener.onBlockComplete(uri);
+
+                if (mCallback != null) {
+                    mCallback.onChangeFilteredNumberSuccess();
                 }
             }
         };
-        mHandler.blockNumber(onBlockNumberListener, getArguments().getString(ARG_NORMALIZED_NUMBER),
-                getArguments().getString(ARG_NUMBER), getArguments().getString(ARG_COUNTRY_ISO));
+
+        mHandler.blockNumber(
+                onBlockNumberListener,
+                getArguments().getString(ARG_NORMALIZED_NUMBER),
+                getArguments().getString(ARG_NUMBER),
+                getArguments().getString(ARG_COUNTRY_ISO));
     }
 
     private void unblockNumber() {
-        final String displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
-        final String message = getUnblockedMessage(displayNumber);
-        final String undoMessage = getBlockedMessage(displayNumber);
-        final OnBlockNumberListener undoListener =
-                new OnBlockNumberListener() {
+        final String message = getUnblockedMessage();
+        final String undoMessage = getBlockedMessage();
+
+        final OnBlockNumberListener onUndoListener = new OnBlockNumberListener() {
+            @Override
+            public void onBlockComplete(final Uri uri) {
+                Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
+                if (mCallback != null) {
+                    mCallback.onChangeFilteredNumberUndo();
+                }
+            }
+        };
+
+        mHandler.unblock(new OnUnblockNumberListener() {
+            @Override
+            public void onUnblockComplete(int rows, final ContentValues values) {
+                final View.OnClickListener undoListener = new View.OnClickListener() {
                     @Override
-                    public void onBlockComplete(final Uri uri) {
-                        Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
+                    public void onClick(View view) {
+                        // Re-insert the row on 'undo', with a new ID.
+                        mHandler.blockNumber(onUndoListener, values);
                     }
                 };
-        mHandler.unblock(
-                new OnUnblockNumberListener() {
-                    @Override
-                    public void onUnblockComplete(int rows, final ContentValues values) {
-                        Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
-                                .setAction(R.string.block_number_undo,
-                                        new View.OnClickListener() {
-                                            // Re-insert the row on 'undo', with a new ID.
-                                            @Override
-                                            public void onClick(View view) {
-                                                mHandler.blockNumber(undoListener, values);
-                                            }
-                                        })
-                                .show();
-                    }
-                }, getArguments().getInt(ARG_BLOCK_ID));
+
+                Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
+                        .setAction(R.string.block_number_undo, undoListener)
+                        .show();
+
+                if (mCallback != null) {
+                    mCallback.onChangeFilteredNumberSuccess();
+                }
+            }
+        }, getArguments().getInt(ARG_BLOCK_ID));
     }
 }
diff --git a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java b/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
index 356c55c..bb194be 100644
--- a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
+++ b/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
@@ -104,7 +104,7 @@
         showManagementUi();
     }
 
-    private void showManagementUi() {
+    public void showManagementUi() {
         mIsShowingManagementUi = true;
 
         showManagementUiActionBar();
diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java
index eef24af..ae64057 100644
--- a/src/com/android/dialer/list/BlockedListSearchFragment.java
+++ b/src/com/android/dialer/list/BlockedListSearchFragment.java
@@ -32,8 +32,10 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
 import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
 
-public class BlockedListSearchFragment extends RegularSearchFragment {
+public class BlockedListSearchFragment extends RegularSearchFragment
+        implements FilterNumberDialogFragment.Callback {
     private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
 
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
@@ -45,7 +47,6 @@
                 getContext().getContentResolver());
     }
 
-
     @Override
     protected ContactEntryListAdapter createListAdapter() {
         BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity());
@@ -79,9 +80,9 @@
         }
     }
 
-    // Prevent SearchFragment.onItemClicked from being called.
     @Override
     protected void onItemClick(int position, long id) {
+        // Prevent SearchFragment.onItemClicked from being called.
     }
 
     private void blockNumber(final String number) {
@@ -97,12 +98,15 @@
             @Override
             public void onCheckComplete(Integer id) {
                 if (id == null) {
-                    final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment
-                            .newInstance(id, normalizedNumber, number, countryIso, number);
-                    newFragment.setParentView(
-                            getActivity().findViewById(R.id.blocked_numbers_activity_container));
-                    newFragment.show(
-                            getFragmentManager(), FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+                    FilterNumberDialogFragment.show(
+                            id,
+                            normalizedNumber,
+                            number,
+                            countryIso,
+                            number,
+                            R.id.blocked_numbers_activity_container,
+                            getFragmentManager(),
+                            null /* callback */);
                 } else {
                     Toast.makeText(getContext(), getString(R.string.alreadyBlocked, number),
                             Toast.LENGTH_SHORT).show();
@@ -113,6 +117,21 @@
                 onCheckListener, normalizedNumber, number, countryIso);
     }
 
+    @Override
+    public void onChangeFilteredNumberSuccess() {
+        ManageBlockedNumbersActivity activity = (ManageBlockedNumbersActivity) getActivity();
+        if (activity == null) {
+            return;
+        }
+
+        activity.showManagementUi();
+    }
+
+    @Override
+    public void onChangeFilteredNumberUndo() {
+        getAdapter().notifyDataSetChanged();
+    }
+
     private void blockContactNumber(
             final BlockedListSearchAdapter adapter,
             final ContactListItemView view,
@@ -131,10 +150,15 @@
                     Toast.LENGTH_SHORT).show();
             return;
         }
-        final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment
-                .newInstance(blockId, normalizedNumber, number, countryIso, number);
-        newFragment.setParentView(
-                getActivity().findViewById(R.id.blocked_numbers_activity_container));
-        newFragment.show(getFragmentManager(), FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+
+        FilterNumberDialogFragment.show(
+                blockId,
+                normalizedNumber,
+                number,
+                countryIso,
+                number,
+                R.id.blocked_numbers_activity_container,
+                getFragmentManager(),
+                this);
     }
 }