From 113346fccb1eefd1e97deaaaee7bb3f3763f2540 Mon Sep 17 00:00:00 2001 From: Anne Rong Date: Wed, 30 Sep 2015 17:42:14 -0700 Subject: Add blocked number indicator to search screen for adding a blocked number. Bug: 24468656 Change-Id: I31091e2dde07dabc432247fd4e409907fada152b --- .../BlockedNumberSearchActivity.java | 67 +----------- .../filterednumber/FilterNumberDialogFragment.java | 106 ++++++++++++------ .../dialer/list/BlockedListSearchAdapter.java | 54 ++++++++++ .../dialer/list/BlockedListSearchFragment.java | 118 ++++++++++++++++++--- 4 files changed, 236 insertions(+), 109 deletions(-) (limited to 'src') diff --git a/src/com/android/dialer/filterednumber/BlockedNumberSearchActivity.java b/src/com/android/dialer/filterednumber/BlockedNumberSearchActivity.java index a8cbfb3ca..11c0ac4bc 100644 --- a/src/com/android/dialer/filterednumber/BlockedNumberSearchActivity.java +++ b/src/com/android/dialer/filterednumber/BlockedNumberSearchActivity.java @@ -36,14 +36,14 @@ import com.android.contacts.common.dialog.IndeterminateProgressDialog; import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; import com.android.dialer.R; import com.android.dialer.database.FilteredNumberAsyncQueryHandler; +import com.android.dialer.list.BlockedListSearchAdapter; import com.android.dialer.list.OnListFragmentScrolledListener; import com.android.dialer.list.BlockedListSearchFragment; import com.android.dialer.list.SearchFragment; import com.android.dialer.widget.SearchEditTextLayout; public class BlockedNumberSearchActivity extends AppCompatActivity - implements SearchFragment.HostInterface, OnPhoneNumberPickerActionListener { - private static final String TAG = "BlockedNumberSearch"; + implements SearchFragment.HostInterface { private static final String TAG_BLOCKED_SEARCH_FRAGMENT = "blocked_search"; private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler; @@ -115,7 +115,7 @@ public class BlockedNumberSearchActivity extends AppCompatActivity return; } final FragmentTransaction transaction = getFragmentManager().beginTransaction(); - SearchFragment fragment = (SearchFragment) getFragmentManager() + BlockedListSearchFragment fragment = (BlockedListSearchFragment) getFragmentManager() .findFragmentByTag(TAG_BLOCKED_SEARCH_FRAGMENT); if (fragment == null) { fragment = new BlockedListSearchFragment(); @@ -125,6 +125,8 @@ public class BlockedNumberSearchActivity extends AppCompatActivity } fragment.setHasOptionsMenu(false); fragment.setShowEmptyListForNullQuery(true); + fragment.setDirectorySearchEnabled(false); + fragment.setFilteredNumberAsyncQueryHandler(mFilteredNumberAsyncQueryHandler); transaction.commit(); } @@ -132,65 +134,6 @@ public class BlockedNumberSearchActivity extends AppCompatActivity public void onAttachFragment(Fragment fragment) { if (fragment instanceof BlockedListSearchFragment) { mSearchFragment = (BlockedListSearchFragment) fragment; - mSearchFragment.setOnPhoneNumberPickerActionListener(this); - } - } - - @Override - public void onPickDataUri(Uri dataUri, int callInitiationType) { - Log.w(TAG, "onPickDataUri unsupported, ignoring."); - } - - @Override - public void onPickPhoneNumber(String phoneNumber, boolean isVideoCall, int callInitiationType) { - blockNumber(phoneNumber); - } - - @Override - public void onShortcutIntentCreated(Intent intent) { - Log.w(TAG, "Unsupported intent has come (" + intent + "). Ignoring."); - } - - @Override - public void onHomeInActionBarSelected() { - } - - private void blockNumber(final String number) { - final String countryIso = GeoUtil.getCurrentCountryIso(BlockedNumberSearchActivity.this); - final IndeterminateProgressDialog progressDialog = - IndeterminateProgressDialog.show(getFragmentManager(), - getString(R.string.checkingNumber, number), null, 500); - final String normalizedNumber = - FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso); - if (normalizedNumber == null) { - progressDialog.dismiss(); - Toast.makeText( - BlockedNumberSearchActivity.this, getString(R.string.invalidNumber, number), - Toast.LENGTH_SHORT).show(); - } else { - final FilteredNumberAsyncQueryHandler.OnCheckBlockedListener onCheckListener = - new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() { - @Override - public void onCheckComplete(Integer id) { - progressDialog.dismiss(); - if (id == null) { - final FilterNumberDialogFragment newFragment = - FilterNumberDialogFragment.newInstance(id, normalizedNumber, - number, countryIso, number); - newFragment.setQueryHandler(mFilteredNumberAsyncQueryHandler); - newFragment.setParentView( - findViewById(R.id.search_activity_container)); - newFragment.show(getFragmentManager(), - FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT); - } else { - Toast.makeText(BlockedNumberSearchActivity.this, - getString(R.string.alreadyBlocked, number), - Toast.LENGTH_SHORT).show(); - } - } - }; - mFilteredNumberAsyncQueryHandler.startBlockedQuery( - onCheckListener, normalizedNumber, number, countryIso); } } diff --git a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java b/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java index e9a88c845..1b953875c 100644 --- a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java +++ b/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java @@ -21,6 +21,7 @@ import android.app.Dialog; import android.app.DialogFragment; import android.content.ContentValues; import android.content.DialogInterface; +import android.content.res.Resources; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.Snackbar; @@ -28,6 +29,8 @@ import android.view.View; import com.android.dialer.R; import com.android.dialer.database.FilteredNumberAsyncQueryHandler; +import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener; +import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener; public class FilterNumberDialogFragment extends DialogFragment { public static final String BLOCK_DIALOG_FRAGMENT = "blockUnblockNumberDialog"; @@ -40,6 +43,23 @@ public class FilterNumberDialogFragment extends DialogFragment { private FilteredNumberAsyncQueryHandler mHandler; private View mParentView; + private OnBlockListener mOnBlockListener; + private OnUndoBlockListener mOnUndoBlockListener; + + public interface OnBlockListener { + /** + * Invoked after inserting a blocked number. + * @param uri The uri of the newly created row. + */ + public void onBlockComplete(Uri uri); + } + + public interface OnUndoBlockListener { + /** + * Invoked on undoing the blocking of a number. + */ + public void onUndoBlockComplete(); + } public void setQueryHandler (FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) { mHandler = filteredNumberAsyncQueryHandler; @@ -49,6 +69,14 @@ public class FilterNumberDialogFragment extends DialogFragment { 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) { final FilterNumberDialogFragment fragment = new FilterNumberDialogFragment(); @@ -95,50 +123,62 @@ public class FilterNumberDialogFragment extends DialogFragment { return builder.create(); } - public void blockNumber() { - final String displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER); - final String message = getString(R.string.snackbar_number_blocked, displayNumber); - final String undoMessage = getString(R.string.snackbar_number_unblocked, displayNumber); - final FilteredNumberAsyncQueryHandler.OnUnblockNumberListener undoListener = - new FilteredNumberAsyncQueryHandler.OnUnblockNumberListener() { - @Override - public void onUnblockComplete(int rows, ContentValues values) { - Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show(); - } - }; + private String getBlockedMessage(String displayNumber) { + return getString(R.string.snackbar_number_blocked, displayNumber); + } - mHandler.blockNumber( - new FilteredNumberAsyncQueryHandler.OnBlockNumberListener() { - @Override - public void onBlockComplete(final Uri 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(undoListener, uri); - } - }) - .show(); - } - }, getArguments().getString(ARG_NORMALIZED_NUMBER), + private String getUnblockedMessage(String displayNumber) { + return getString(R.string.snackbar_number_unblocked, displayNumber); + } + + private void blockNumber() { + final String displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER); + final String message = getBlockedMessage(displayNumber); + final String undoMessage = getUnblockedMessage(displayNumber); + 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(); + } + } + }; + final OnBlockNumberListener onBlockNumberListener = new OnBlockNumberListener() { + @Override + public void onBlockComplete(final Uri 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); + } + }) + .show(); + if (mOnBlockListener != null) { + mOnBlockListener.onBlockComplete(uri); + } + } + }; + mHandler.blockNumber(onBlockNumberListener, getArguments().getString(ARG_NORMALIZED_NUMBER), getArguments().getString(ARG_NUMBER), getArguments().getString(ARG_COUNTRY_ISO)); } - public void unblockNumber() { + private void unblockNumber() { final String displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER); - final String message = getString(R.string.snackbar_number_unblocked, displayNumber); - final String undoMessage = getString(R.string.snackbar_number_blocked, displayNumber); - final FilteredNumberAsyncQueryHandler.OnBlockNumberListener undoListener = - new FilteredNumberAsyncQueryHandler.OnBlockNumberListener() { + final String message = getUnblockedMessage(displayNumber); + final String undoMessage = getBlockedMessage(displayNumber); + final OnBlockNumberListener undoListener = + new OnBlockNumberListener() { @Override public void onBlockComplete(final Uri uri) { Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show(); } }; mHandler.unblock( - new FilteredNumberAsyncQueryHandler.OnUnblockNumberListener() { + new OnUnblockNumberListener() { @Override public void onUnblockComplete(int rows, final ContentValues values) { Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG) diff --git a/src/com/android/dialer/list/BlockedListSearchAdapter.java b/src/com/android/dialer/list/BlockedListSearchAdapter.java index 52e0c646f..7ae24e468 100644 --- a/src/com/android/dialer/list/BlockedListSearchAdapter.java +++ b/src/com/android/dialer/list/BlockedListSearchAdapter.java @@ -16,20 +16,74 @@ package com.android.dialer.list; import android.content.Context; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.Color; +import android.view.View; + +import com.android.contacts.common.GeoUtil; +import com.android.contacts.common.list.ContactListItemView; +import com.android.dialer.R; +import com.android.dialer.database.FilteredNumberAsyncQueryHandler; /** * List adapter to display search results for adding a blocked number. */ public class BlockedListSearchAdapter extends RegularSearchListAdapter { + private Resources mResources; + private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler; + public BlockedListSearchAdapter(Context context) { super(context); + mResources = context.getResources(); disableAllShortcuts(); setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, true); } + public void setFilteredNumberAsyncQueryHandler(FilteredNumberAsyncQueryHandler handler) { + mFilteredNumberAsyncQueryHandler = handler; + } + @Override protected boolean isChanged(boolean showNumberShortcuts) { return setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, showNumberShortcuts || mIsQuerySipAddress); } + + public void setViewBlocked(ContactListItemView view, Integer id) { + view.setTag(R.id.block_id, id); + final int textColor = mResources.getColor(R.color.blocked_number_block_color); + view.getDataView().setTextColor(textColor); + view.getLabelView().setTextColor(textColor); + //TODO: Add icon + } + + public void setViewUnblocked(ContactListItemView view) { + view.setTag(R.id.block_id, null); + final int textColor = mResources.getColor(R.color.dialtacts_secondary_text_color); + view.getDataView().setTextColor(textColor); + view.getLabelView().setTextColor(textColor); + //TODO: Remove icon + } + + @Override + protected void bindView(View itemView, int partition, Cursor cursor, int position) { + super.bindView(itemView, partition, cursor, position); + final ContactListItemView view = (ContactListItemView) itemView; + final String number = getPhoneNumber(position); + final String countryIso = GeoUtil.getCurrentCountryIso(mContext); + final String normalizedNumber = + FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso); + final FilteredNumberAsyncQueryHandler.OnCheckBlockedListener onCheckListener = + new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() { + @Override + public void onCheckComplete(Integer id) { + if (id != null) { + setViewBlocked(view, id); + } + } + }; + mFilteredNumberAsyncQueryHandler.startBlockedQuery( + onCheckListener, normalizedNumber, number, countryIso); + } } \ No newline at end of file diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java index d02577228..7494372fb 100644 --- a/src/com/android/dialer/list/BlockedListSearchFragment.java +++ b/src/com/android/dialer/list/BlockedListSearchFragment.java @@ -15,48 +15,138 @@ */ package com.android.dialer.list; +import android.content.ContentUris; +import android.content.ContentValues; +import android.net.Uri; import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Toast; +import com.android.contacts.common.GeoUtil; +import com.android.contacts.common.dialog.IndeterminateProgressDialog; import com.android.contacts.common.list.ContactEntryListAdapter; -import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; +import com.android.contacts.common.list.ContactListItemView; +import com.android.dialer.R; +import com.android.dialer.database.FilteredNumberAsyncQueryHandler; +import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener; +import com.android.dialer.filterednumber.FilterNumberDialogFragment; public class BlockedListSearchFragment extends RegularSearchFragment { private static final String TAG = BlockedListSearchFragment.class.getSimpleName(); + private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler; + + public void setFilteredNumberAsyncQueryHandler(FilteredNumberAsyncQueryHandler handler) { + mFilteredNumberAsyncQueryHandler = handler; + } + @Override protected ContactEntryListAdapter createListAdapter() { BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity()); adapter.setDisplayPhotos(true); adapter.setUseCallableUri(usesCallableUri()); + adapter.setFilteredNumberAsyncQueryHandler(mFilteredNumberAsyncQueryHandler); return adapter; } @Override - protected void onItemClick(int position, long id) { - final DialerPhoneNumberListAdapter adapter = (DialerPhoneNumberListAdapter) getAdapter(); - final int shortcutType = adapter.getShortcutTypeFromPosition(position); - final OnPhoneNumberPickerActionListener listener = getOnPhoneNumberPickerListener(); + public void onItemClick(AdapterView parent, View view, int position, long id) { + super.onItemClick(parent, view, position, id); + final int adapterPosition = position - getListView().getHeaderViewsCount(); + final BlockedListSearchAdapter adapter = (BlockedListSearchAdapter) getAdapter(); + final int shortcutType = adapter.getShortcutTypeFromPosition(adapterPosition); + final Integer blockId = (Integer) view.getTag(R.id.block_id); final String number; - - if (listener == null) { - Log.d(TAG, "getOnPhoneNumberPickerListener() returned null in onItemClick."); - return; - } - switch (shortcutType) { case DialerPhoneNumberListAdapter.SHORTCUT_INVALID: // Handles click on a search result, either contact or nearby places result. - number = adapter.getPhoneNumber(position); - listener.onPickPhoneNumber(number, false, getCallInitiationType(false)); + number = adapter.getPhoneNumber(adapterPosition); + blockContactNumber(adapter, (ContactListItemView) view, number, blockId); break; case DialerPhoneNumberListAdapter.SHORTCUT_BLOCK_NUMBER: // Handles click on 'Block number' shortcut to add the user query as a number. number = adapter.getQueryString(); - listener.onPickPhoneNumber(number, false, getCallInitiationType(false)); + blockNumber(number); break; default: Log.w(TAG, "Ignoring unsupported shortcut type: " + shortcutType); break; } } + + // Prevent SearchFragment.onItemClicked from being called. + @Override + protected void onItemClick(int position, long id) { + } + + private void blockNumber(final String number) { + final String countryIso = GeoUtil.getCurrentCountryIso(getContext()); + final IndeterminateProgressDialog progressDialog = + IndeterminateProgressDialog.show(getFragmentManager(), + getString(R.string.checkingNumber, number), null, 500); + final String normalizedNumber = + FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso); + if (normalizedNumber == null) { + progressDialog.dismiss(); + Toast.makeText(getContext(), getString(R.string.invalidNumber, number), + Toast.LENGTH_SHORT).show(); + return; + } + final OnCheckBlockedListener onCheckListener = new OnCheckBlockedListener() { + @Override + public void onCheckComplete(Integer id) { + progressDialog.dismiss(); + if (id == null) { + final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment + .newInstance(id, normalizedNumber, number, countryIso, number); + newFragment.setQueryHandler(mFilteredNumberAsyncQueryHandler); + newFragment.setParentView( + getActivity().findViewById(R.id.search_activity_container)); + newFragment.show( + getFragmentManager(), FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT); + } else { + Toast.makeText(getContext(), getString(R.string.alreadyBlocked, number), + Toast.LENGTH_SHORT).show(); + } + } + }; + mFilteredNumberAsyncQueryHandler.startBlockedQuery( + onCheckListener, normalizedNumber, number, countryIso); + } + + private void blockContactNumber(final BlockedListSearchAdapter adapter, + final ContactListItemView view, final String number, + final Integer blockId) { + final String countryIso = GeoUtil.getCurrentCountryIso(getContext()); + final String normalizedNumber = + FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso); + if (normalizedNumber == null) { + Toast.makeText(getContext(), getString(R.string.invalidNumber, number), + Toast.LENGTH_SHORT).show(); + return; + } + if (blockId != null) { + Toast.makeText(getContext(), getString(R.string.alreadyBlocked, number), + Toast.LENGTH_SHORT).show(); + return; + } + final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment + .newInstance(blockId, normalizedNumber, number, countryIso, number); + newFragment.setQueryHandler(mFilteredNumberAsyncQueryHandler); + newFragment.setParentView(getActivity().findViewById(R.id.search_activity_container)); + newFragment.setOnUndoBlockListener(new FilterNumberDialogFragment.OnUndoBlockListener() { + @Override + public void onUndoBlockComplete() { + adapter.setViewUnblocked(view); + } + }); + newFragment.setOnBlockListener(new FilterNumberDialogFragment.OnBlockListener() { + @Override + public void onBlockComplete(Uri uri) { + adapter.setViewBlocked(view, Long.valueOf(ContentUris.parseId(uri)).intValue()); + } + }); + newFragment.show(getFragmentManager(), FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT); + } } -- cgit v1.2.3