Merge "Fix some proguard rules to fix tests" into ub-contactsdialer-a-dev
diff --git a/Android.mk b/Android.mk
index 0d7754c..bd0c9de 100644
--- a/Android.mk
+++ b/Android.mk
@@ -7,6 +7,12 @@
contacts_common_dir := ../ContactsCommon
phone_common_dir := ../PhoneCommon
+ifeq ($(TARGET_BUILD_APPS),)
+support_library_root_dir := frameworks/support
+else
+support_library_root_dir := prebuilts/sdk/current/support
+endif
+
src_dirs := src \
$(incallui_dir)/src \
$(contacts_common_dir)/src \
@@ -19,10 +25,10 @@
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs)) \
- frameworks/support/v7/appcompat/res \
- frameworks/support/v7/cardview/res \
- frameworks/support/v7/recyclerview/res \
- frameworks/support/design/res
+ $(support_library_root_dir)/v7/cardview/res \
+ $(support_library_root_dir)/v7/recyclerview/res \
+ $(support_library_root_dir)/v7/appcompat/res \
+ $(support_library_root_dir)/design/res
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7d6e505..9267d06 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,8 +17,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.dialer"
coreApp="true"
- android:versionCode="20302"
- android:versionName="2.3.02">
+ android:versionCode="20303"
+ android:versionName="2.3.03">
<uses-sdk
android:minSdkVersion="23"
@@ -148,7 +148,7 @@
android:exported="false">
</activity>
- <activity android:name="com.android.dialer.filterednumber.ManageBlockedNumbersActivity"
+ <activity android:name="com.android.dialer.filterednumber.BlockedNumbersSettingsActivity"
android:label="@string/manage_blocked_numbers_label"
android:parentActivityName="com.android.dialer.settings.DialerSettingsActivity"
android:theme="@style/ManageBlockedNumbersStyle"
diff --git a/res/drawable/blocked_number_item_background.xml b/res/drawable/ic_blocked_numbers_settings_add.xml
similarity index 63%
rename from res/drawable/blocked_number_item_background.xml
rename to res/drawable/ic_blocked_numbers_settings_add.xml
index acfea20..adcf906 100644
--- a/res/drawable/blocked_number_item_background.xml
+++ b/res/drawable/ic_blocked_numbers_settings_add.xml
@@ -15,15 +15,6 @@
limitations under the License.
-->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape android:shape="rectangle">
- <solid android:color="@color/divider_line_color" />
- </shape>
- </item>
- <item android:bottom="1dp">
- <shape android:shape="rectangle">
- <solid android:color="@android:color/white" />
- </shape>
- </item>
-</layer-list>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_add_24dp"
+ android:tint="@color/blocked_number_icon_tint" />
diff --git a/res/layout/blocked_number_fragment.xml b/res/layout/blocked_number_fragment.xml
index 7aff06e..4bc2085 100644
--- a/res/layout/blocked_number_fragment.xml
+++ b/res/layout/blocked_number_fragment.xml
@@ -18,7 +18,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:paddingTop="?android:attr/actionBarSize"
android:background="@color/blocked_number_background">
<ListView android:id="@id/android:list"
diff --git a/res/layout/blocked_number_header.xml b/res/layout/blocked_number_header.xml
index ce1d4fe..50a3dc8 100644
--- a/res/layout/blocked_number_header.xml
+++ b/res/layout/blocked_number_header.xml
@@ -17,7 +17,8 @@
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:focusable="false">
<LinearLayout android:id="@+id/blocked_numbers_disabled_for_emergency"
android:layout_width="match_parent"
@@ -25,6 +26,7 @@
android:orientation="vertical"
android:layout_marginBottom="8dp"
android:padding="16dp"
+ android:focusable="true"
android:visibility="gone">
<TextView
@@ -43,39 +45,6 @@
</LinearLayout>
-
- <android.support.v7.widget.CardView
- android:id="@+id/hide_blocked_calls_setting"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="8dp"
- card_view:cardCornerRadius="0dp">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:padding="16dp"
- android:paddingEnd="8dp"
- android:background="@android:color/white">
-
- <TextView
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/blocked_call_settings_hide_setting"
- style="@style/BlockedNumbersDescriptionTextStyle" />
-
- <Switch android:id="@+id/hide_blocked_calls_switch"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="40dp" />
-
- </LinearLayout>
-
- </android.support.v7.widget.CardView>
-
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -85,7 +54,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:background="@android:color/white">
+ android:background="@android:color/white"
+ android:focusable="true">
<TextView android:id="@+id/textView"
android:layout_width="wrap_content"
@@ -131,18 +101,29 @@
android:layout_height="1dp"
android:layout_below="@id/import_button"
android:background="@color/divider_line_color"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp" />
+ android:layout_marginTop="8dp" />
</RelativeLayout>
- <Button android:id="@+id/add_number_button"
- android:layout_width="wrap_content"
+ <TextView android:id="@+id/add_number_textview"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:layout_marginEnd="@dimen/blocked_number_container_padding"
- android:layout_marginBottom="8dp"
- android:text="@string/blockNumber" />
+ android:background="?android:attr/selectableItemBackground"
+ android:textColor="@color/blocked_number_primary_text_color"
+ android:textSize="@dimen/blocked_number_primary_text_size"
+ android:paddingTop="24dp"
+ android:paddingBottom="24dp"
+ android:paddingEnd="@dimen/blocked_number_container_padding"
+ android:paddingStart="24dp"
+ android:drawableStart="@drawable/ic_blocked_numbers_settings_add"
+ android:drawablePadding="24dp"
+ android:text="@string/addBlockedNumber" />
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginStart="72dp"
+ android:background="@color/divider_line_color" />
</LinearLayout>
diff --git a/res/layout/blocked_number_item.xml b/res/layout/blocked_number_item.xml
index 79ca42e..82e2207 100644
--- a/res/layout/blocked_number_item.xml
+++ b/res/layout/blocked_number_item.xml
@@ -25,7 +25,7 @@
android:gravity="center_vertical"
android:orientation="horizontal"
android:focusable="true"
- android:background="@drawable/blocked_number_item_background">
+ android:background="@android:color/white">
<QuickContactBadge
android:id="@+id/quick_contact_photo"
@@ -69,7 +69,7 @@
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_remove"
android:scaleType="center"
- android:tint="@color/delete_icon_tint"
+ android:tint="@color/blocked_number_icon_tint"
android:contentDescription="@string/description_blocked_number_list_delete" />
</LinearLayout>
diff --git a/res/layout/blocked_numbers_activity.xml b/res/layout/blocked_numbers_activity.xml
index b5810b7..d28eaf8 100644
--- a/res/layout/blocked_numbers_activity.xml
+++ b/res/layout/blocked_numbers_activity.xml
@@ -17,5 +17,6 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/blocked_numbers_activity_container"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/action_bar_height">
</FrameLayout>
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index 262a176..ca00405 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -19,7 +19,6 @@
android:gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingBottom="@dimen/call_log_actions_bottom_padding"
android:orientation="vertical"
android:visibility="visible"
android:importantForAccessibility="1">
diff --git a/res/layout/view_numbers_to_import_fragment.xml b/res/layout/view_numbers_to_import_fragment.xml
index c79e69a..1836f8d 100644
--- a/res/layout/view_numbers_to_import_fragment.xml
+++ b/res/layout/view_numbers_to_import_fragment.xml
@@ -18,7 +18,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:paddingTop="?android:attr/actionBarSize"
android:background="@color/blocked_number_background">
<ListView android:id="@id/android:list"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 76bc093..2ca697f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -127,7 +127,7 @@
<color name="blocked_contact_background">#afafaf</color>
<color name="blocked_number_primary_text_color">@color/dialtacts_primary_text_color</color>
<color name="blocked_number_secondary_text_color">@color/dialtacts_secondary_text_color</color>
- <color name="delete_icon_tint">#6D6D6D</color>
+ <color name="blocked_number_icon_tint">#616161</color>
<color name="blocked_number_background">#E0E0E0</color>
<color name="blocked_number_accent_color">#42A5F5</color>
<color name="blocked_number_block_color">#F44336</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b5703c6..4d4fb1e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -855,12 +855,6 @@
You previously marked some callers to be automatically sent to voicemail via other apps.
</string>
- <!-- Text for a setting to hide blocked calls and automatically delete new voicemail from block
- numbers. [CHAR LIMIT=NONE] -->
- <string name="blocked_call_settings_hide_setting">
- Hide calls and automatically delete new voicemails from blocked numbers.
- </string>
-
<!-- Label for button to view numbers of contacts previous marked to be sent to voicemail.
[CHAR_LIMIT=20] -->
<string name="blocked_call_settings_view_numbers_button">View Numbers</string>
@@ -878,17 +872,11 @@
<string name="description_blocked_number_list_delete">Unblock number</string>
<!-- Button to bring up UI to add a number to the blocked call list. [CHAR LIMIT=40] -->
- <string name="blockNumber">Add number</string>
+ <string name="addBlockedNumber">Add number</string>
<!-- Heading for the block list in the "Spam and blocked cal)ls" settings. [CHAR LIMIT=64] -->
<string name="blockList">Block list</string>
- <!-- Label for progress dialog when validating a number to be added to the block list.
- [CHAR LIMIT=64] -->
- <string name="checkingNumber">Checking
- <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
- </string>
-
<!-- Error message shown when user tries to add invalid number to the block list.
[CHAR LIMIT=64] -->
<string name="invalidNumber"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
@@ -899,6 +887,19 @@
<string name="alreadyBlocked"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
is already blocked.</string>
+ <!-- Title of notification telling the user that call blocking has been temporarily disabled.
+ [CHAR LIMIT=56] -->
+ <string name="call_blocking_disabled_notification_title">
+ Call blocking disabled for 48 hours
+ </string>
+
+ <!-- Text for notification which provides the reason that call blocking has been temporarily
+ disabled. Namely, we disable call blocking after an emergency call in case of return
+ phone calls made by emergency services. [CHAR LIMIT=64] -->
+ <string name="call_blocking_disabled_notification_text">
+ Disabled because an emergency call was made.
+ </string>
+
<!-- Label for the phone account settings [CHAR LIMIT=30] -->
<string name="phone_account_settings_label">Calling accounts</string>
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 2121e98..ab63ddc 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -55,7 +55,7 @@
import com.android.dialer.calllog.PhoneAccountUtils;
import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
import com.android.dialer.filterednumber.FilteredNumbersUtil;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil.CallIntentBuilder;
@@ -71,7 +71,7 @@
*/
public class CallDetailActivity extends AppCompatActivity
implements MenuItem.OnMenuItemClickListener, View.OnClickListener,
- FilterNumberDialogFragment.Callback {
+ BlockNumberDialogFragment.Callback {
private static final String TAG = CallDetailActivity.class.getSimpleName();
/** A long array extra containing ids of call log entries to display. */
@@ -196,7 +196,6 @@
private PhoneCallDetails mDetails;
protected String mNumber;
private Uri mVoicemailUri;
- private String mDefaultCountryIso;
private String mDisplayNumber;
private ListView mHistoryList;
@@ -242,7 +241,6 @@
mCallerName = (TextView) findViewById(R.id.caller_name);
mCallerNumber = (TextView) findViewById(R.id.caller_number);
mAccountLabel = (TextView) findViewById(R.id.phone_account_label);
- mDefaultCountryIso = GeoUtil.getCurrentCountryIso(this);
mContactPhotoManager = ContactPhotoManager.getInstance(this);
mCallButton = findViewById(R.id.call_back_button);
@@ -358,9 +356,8 @@
public void onClick(View view) {
switch(view.getId()) {
case R.id.call_detail_action_block:
- FilterNumberDialogFragment.show(
+ BlockNumberDialogFragment.show(
mBlockedNumberId,
- null /* normalizedNumber */,
mNumber,
mDetails.countryIso,
mDisplayNumber,
@@ -392,11 +389,12 @@
}
private void updatePhotoAndBlockActionItem() {
- if (mDetails == null || !FilteredNumbersUtil.canBlockNumber(this, mNumber)) {
+ if (mDetails == null ||
+ !FilteredNumbersUtil.canBlockNumber(this, mNumber, mDetails.countryIso)) {
return;
}
- boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+ final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
new OnCheckBlockedListener() {
@Override
public void onCheckComplete(Integer id) {
@@ -405,9 +403,9 @@
updateContactPhoto();
updateBlockActionItem();
}
- }, null, mNumber, mDetails.countryIso);
+ }, mNumber, mDetails.countryIso);
- if (failed) {
+ if (!success) {
updateContactPhoto();
updateBlockActionItem();
}
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index b395723..9f1af83 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -50,12 +50,13 @@
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.filterednumber.BlockNumberDialogFragment;
import com.android.dialer.util.PhoneNumberUtil;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Adapter class to fill in data for the Call Log.
@@ -63,7 +64,7 @@
public class CallLogAdapter extends GroupingListAdapter
implements CallLogGroupBuilder.GroupCreator,
VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
- FilterNumberDialogFragment.Callback {
+ BlockNumberDialogFragment.Callback {
/** Interface used to initiate a refresh of the content. */
public interface CallFetcher {
@@ -71,6 +72,8 @@
}
private static final int NO_EXPANDED_LIST_ITEM = -1;
+ // ConcurrentHashMap doesn't store null values. Use this value for numbers which aren't blocked.
+ private static final int NOT_BLOCKED = -1;
private static final int VOICEMAIL_PROMO_CARD_POSITION = 0;
@@ -91,7 +94,10 @@
private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
protected ContactInfoCache mContactInfoCache;
- protected final Map<NumberWithCountryIso, Integer> mBlockedIdCache;
+ // Declaring static, since this can be shared across different instances, such as history and
+ // voicemail, so when the cache is cleared in one instance, it propagates across all instances.
+ private static final Map<NumberWithCountryIso, Integer> mBlockedIdCache =
+ new ConcurrentHashMap<>();
private boolean mIsCallLogActivity;
@@ -214,8 +220,7 @@
// Only expand if actions are not already expanded, because triggering the expand
// function on clicks causes the action views to lose the focus indicator.
CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) host.getTag();
- if (mVoicemailPlaybackPresenter == null &&
- mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
+ if (mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
expandViewHolderActions((CallLogListItemViewHolder) host.getTag());
}
}
@@ -258,7 +263,6 @@
CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
mTelecomCallLogCache = new TelecomCallLogCache(mContext);
- mBlockedIdCache = new HashMap<>();
PhoneCallDetailsHelper phoneCallDetailsHelper =
new PhoneCallDetailsHelper(mContext, resources, mTelecomCallLogCache);
mCallLogListItemHelper =
@@ -517,20 +521,21 @@
// Update the photo, once we know whether the user's number is blocked or not.
final NumberWithCountryIso blockedIdKey = new NumberWithCountryIso(number, countryIso);
if (mBlockedIdCache.containsKey(blockedIdKey)) {
- views.blockId = mBlockedIdCache.get(blockedIdKey);
+ int blockedId = mBlockedIdCache.get(blockedIdKey);
+ views.blockId = blockedId != NOT_BLOCKED ? blockedId : null;
views.updatePhoto();
} else {
views.blockId = null;
- boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+ final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
new OnCheckBlockedListener() {
@Override
public void onCheckComplete(Integer id) {
- mBlockedIdCache.put(blockedIdKey, id);
+ mBlockedIdCache.put(blockedIdKey, id != null ? id : NOT_BLOCKED);
views.blockId = id;
views.updatePhoto();
}
- }, null, number, countryIso);
- if (failed) {
+ }, number, countryIso);
+ if (!success) {
views.updatePhoto();
}
}
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 2fffaff..7771563 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -46,7 +46,7 @@
public enum Tasks {
DELETE_VOICEMAIL,
DELETE_CALL,
- MARK_BLOCKED,
+ DELETE_BLOCKED_CALL,
MARK_VOICEMAIL_READ,
GET_CALL_DETAILS,
}
@@ -81,7 +81,7 @@
static final int TRANSCRIPTION_COLUMN_INDEX = 11;
}
- private static class CallLogMarkBlockedQuery {
+ private static class CallLogDeleteBlockedCallQuery {
static final String[] PROJECTION = new String[] {
CallLog.Calls._ID,
CallLog.Calls.DATE
@@ -104,7 +104,7 @@
// Try to identify if a call log entry corresponds to a number which was blocked. We match by
// by comparing its creation time to the time it was added in the InCallUi and seeing if they
// fall within a certain threshold.
- private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 1500;
+ private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 3000;
private static AsyncTaskExecutor sAsyncTaskExecutor;
@@ -256,15 +256,16 @@
}
/**
- * Marks last call made by the number the call type of the specified call as BLOCKED in the call log.
+ * Deletes the last call made by the number within a threshold of the call time added in the
+ * call log, assuming it is a blocked call for which no entry should be shown.
*
* @param context The context.
- * @param number Number of which to mark the most recent call as BLOCKED.
+ * @param number Number of blocked call, for which to delete the call log entry.
* @param timeAddedMs The time the number was added to InCall, in milliseconds.
* @param listener The listener to invoke after looking up for a call log entry matching the
* number and time added.
*/
- public static void markCallAsBlocked(
+ public static void deleteBlockedCall(
final Context context,
final String number,
final long timeAddedMs,
@@ -273,23 +274,30 @@
initTaskExecutor();
}
- sAsyncTaskExecutor.submit(Tasks.MARK_BLOCKED, new AsyncTask<Void, Void, Long>() {
+ sAsyncTaskExecutor.submit(Tasks.DELETE_BLOCKED_CALL, new AsyncTask<Void, Void, Long>() {
@Override
public Long doInBackground(Void... params) {
// First, lookup the call log entry of the most recent call with this number.
Cursor cursor = context.getContentResolver().query(
TelecomUtil.getCallLogUri(context),
- CallLogMarkBlockedQuery.PROJECTION,
+ CallLogDeleteBlockedCallQuery.PROJECTION,
CallLog.Calls.NUMBER + "= ?",
new String[] { number },
CallLog.Calls.DATE + " DESC LIMIT 1");
- // If found, return the call log entry id.
+ // If match is found, delete this call log entry and return the call log entry id.
if (cursor.moveToFirst()) {
- long creationTime = cursor.getLong(CallLogMarkBlockedQuery.DATE_COLUMN_INDEX);
+ long creationTime =
+ cursor.getLong(CallLogDeleteBlockedCallQuery.DATE_COLUMN_INDEX);
if (timeAddedMs > creationTime
&& timeAddedMs - creationTime < MATCH_BLOCKED_CALL_THRESHOLD_MS) {
- return cursor.getLong(CallLogMarkBlockedQuery.ID_COLUMN_INDEX);
+ long callLogEntryId =
+ cursor.getLong(CallLogDeleteBlockedCallQuery.ID_COLUMN_INDEX);
+ context.getContentResolver().delete(
+ TelecomUtil.getCallLogUri(context),
+ CallLog.Calls._ID + " IN (" + callLogEntryId + ")",
+ null);
+ return callLogEntryId;
}
}
return (long) -1;
@@ -300,20 +308,6 @@
if (listener != null) {
listener.onQueryFinished(callLogEntryId >= 0);
}
-
- if (callLogEntryId < 0) {
- return;
- }
-
- // Then, update that call log entry to have type BLOCKED.
- final ContentValues values = new ContentValues();
- values.put(CallLog.Calls.TYPE, AppCompatConstants.CALLS_BLOCKED_TYPE);
-
- context.getContentResolver().update(
- TelecomUtil.getCallLogUri(context),
- values,
- CallLog.Calls._ID + "= ?",
- new String[] { Long.toString(callLogEntryId) });
}
});
}
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index f84ffd5..3cf58bd 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -125,7 +125,6 @@
private boolean mRefreshDataRequired = true;
private boolean mHasReadCallLogPermission = false;
- private boolean mShouldHideBlockedCalls = false;
// Exactly same variable is in Fragment as a package private.
private boolean mMenuVisible = true;
@@ -211,8 +210,6 @@
resolver.registerContentObserver(Status.CONTENT_URI, true, mVoicemailStatusObserver);
setHasOptionsMenu(true);
- mShouldHideBlockedCalls = FilteredNumbersUtil.shouldHideBlockedCalls(getActivity());
-
if (mCallTypeFilter == Calls.VOICEMAIL_TYPE) {
mVoicemailPlaybackPresenter = VoicemailPlaybackPresenter
.getInstance(activity, state);
@@ -342,10 +339,6 @@
mRefreshDataRequired = true;
updateEmptyMessage(mCallTypeFilter);
}
- if (mShouldHideBlockedCalls != FilteredNumbersUtil.shouldHideBlockedCalls(getActivity())) {
- mShouldHideBlockedCalls = !mShouldHideBlockedCalls;
- mRefreshDataRequired = true;
- }
mHasReadCallLogPermission = hasReadCallLogPermission;
refreshData();
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 1bc4410..afe8208 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -48,7 +48,7 @@
import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
import com.android.dialer.filterednumber.FilteredNumbersUtil;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.PhoneNumberUtil;
@@ -184,7 +184,7 @@
private final CallLogListItemHelper mCallLogListItemHelper;
private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
- private final FilterNumberDialogFragment.Callback mFilteredNumberDialogCallback;
+ private final BlockNumberDialogFragment.Callback mFilteredNumberDialogCallback;
private final int mPhotoSize;
@@ -198,7 +198,7 @@
CallLogListItemHelper callLogListItemHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter,
FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
- FilterNumberDialogFragment.Callback filteredNumberDialogCallback,
+ BlockNumberDialogFragment.Callback filteredNumberDialogCallback,
View rootView,
QuickContactBadge quickContactView,
View primaryActionView,
@@ -247,7 +247,7 @@
CallLogListItemHelper callLogListItemHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter,
FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
- FilterNumberDialogFragment.Callback filteredNumberDialogCallback) {
+ BlockNumberDialogFragment.Callback filteredNumberDialogCallback) {
return new CallLogListItemViewHolder(
context,
@@ -303,8 +303,8 @@
.setOnMenuItemClickListener(this);
}
- if (FilteredNumbersUtil.canBlockNumber(mContext, number)) {
- mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+ if (FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
+ mFilteredNumberAsyncQueryHandler.isBlockedNumber(
new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
@Override
public void onCheckComplete(Integer id) {
@@ -319,7 +319,7 @@
blockItem.setOnMenuItemClickListener(
CallLogListItemViewHolder.this);
}
- }, info.normalizedNumber, number, countryIso);
+ }, number, countryIso);
}
}
@@ -327,9 +327,8 @@
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.context_menu_block_number:
- FilterNumberDialogFragment.show(
+ BlockNumberDialogFragment.show(
blockId,
- info.normalizedNumber,
number,
countryIso,
displayNumber,
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 01489c1..3efdce7 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -191,13 +191,10 @@
selectionArgs.add(Long.toString(newerThan));
}
- final boolean shouldHideBlockedCalls =
- FilteredNumbersUtil.shouldHideBlockedCalls(mContext);
- if (shouldHideBlockedCalls) {
- where.append(" AND ");
- where.append("(" + Calls.TYPE + " != ?)");
- selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
- }
+ // Always hide blocked calls.
+ where.append(" AND ");
+ where.append("(" + Calls.TYPE + " != ?)");
+ selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
final int limit = (mLogLimit == -1) ? NUM_LOGS_TO_DISPLAY : mLogLimit;
final String selection = where.length() > 0 ? where.toString() : null;
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index 1987b80..635e874 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -135,9 +135,8 @@
mContext, newCall.number, newCall.countryIso, newCall.dateMs)) {
itr.remove();
- if (FilteredNumbersUtil.shouldHideBlockedCalls(mContext)) {
- mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
- }
+ // Delete the voicemail.
+ mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
continue;
}
diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
index 25613a6..06aca78 100644
--- a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
+++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
@@ -25,6 +25,7 @@
import android.database.sqlite.SQLiteDatabaseCorruptException;
import android.net.Uri;
import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
import com.android.contacts.common.util.PhoneNumberHelper;
import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
@@ -78,6 +79,14 @@
public void onUnblockComplete(int rows, ContentValues values);
}
+ public interface OnHasBlockedNumbersListener {
+ /**
+ * @param hasBlockedNumbers {@code true} if any blocked numbers are stored.
+ * {@code false} otherwise.
+ */
+ public void onHasBlockedNumbers(boolean hasBlockedNumbers);
+ }
+
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (cookie != null) {
@@ -120,37 +129,34 @@
null, null, null);
}
- /**
- * Check if the number + country iso given has been blocked.
- * This method normalizes the number for the lookup if normalizedNumber is null.
- * @return {@code true} if the number was invalid and couldn't be checked,
- * {@code false} otherwise,
- */
- public final boolean startBlockedQuery(final OnCheckBlockedListener listener,
- String normalizedNumber, String number, String countryIso) {
- if (normalizedNumber == null) {
- normalizedNumber = getNormalizedNumber(number, countryIso);
- if (normalizedNumber == null) {
- return true;
- }
- }
- startBlockedQuery(listener, normalizedNumber);
- return false;
- }
-
- public static String getNormalizedNumber(String number, String countryIso) {
- if (PhoneNumberHelper.isUriNumber(number)) {
- return number;
- } else {
- return PhoneNumberUtils.formatNumberToE164(number, countryIso);
- }
+ public final void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
+ startQuery(NO_TOKEN,
+ new Listener() {
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ listener.onHasBlockedNumbers(cursor.getCount() > 0);
+ }
+ },
+ getContentUri(null),
+ new String[]{ FilteredNumberColumns._ID },
+ FilteredNumberColumns.TYPE + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
+ null,
+ null);
}
/**
- * Check if the normalized number given has been blocked.
+ * Check if this number has been blocked.
+ *
+ * @return {@code false} if the number was invalid and couldn't be checked,
+ * {@code true} otherwise,
*/
- public final void startBlockedQuery(final OnCheckBlockedListener listener,
- String normalizedNumber) {
+ public final boolean isBlockedNumber(
+ final OnCheckBlockedListener listener, String number, String countryIso) {
+ final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ if (TextUtils.isEmpty(normalizedNumber)) {
+ return false;
+ }
+
startQuery(NO_TOKEN,
new Listener() {
@Override
@@ -170,19 +176,29 @@
}
},
getContentUri(null),
- new String[]{FilteredNumberColumns._ID, FilteredNumberColumns.TYPE},
+ new String[]{ FilteredNumberColumns._ID, FilteredNumberColumns.TYPE },
FilteredNumberColumns.NORMALIZED_NUMBER + " = ?",
- new String[]{normalizedNumber},
+ new String[]{ normalizedNumber },
null);
+
+ return true;
+ }
+
+ public final void blockNumber(
+ final OnBlockNumberListener listener, String number, String countryIso) {
+ blockNumber(listener, null, number, countryIso);
}
/**
* Add a number manually blocked by the user.
*/
- public final void blockNumber(final OnBlockNumberListener listener,
- String normalizedNumber, String number, String countryIso) {
+ public final void blockNumber(
+ final OnBlockNumberListener listener,
+ String normalizedNumber,
+ String number,
+ String countryIso) {
if (normalizedNumber == null) {
- normalizedNumber = getNormalizedNumber(number, countryIso);
+ normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
}
ContentValues v = new ContentValues();
v.put(FilteredNumberColumns.NORMALIZED_NUMBER, normalizedNumber);
diff --git a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
similarity index 85%
rename from src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
rename to src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
index 8473e32..7a94eeb 100644
--- a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
@@ -21,11 +21,13 @@
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.ContentValues;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
+import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;
@@ -35,7 +37,11 @@
import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
-public class FilterNumberDialogFragment extends DialogFragment {
+/**
+ * Fragment for confirming and enacting blocking/unblocking a number. Also invokes snackbar
+ * providing undo functionality.
+ */
+public class BlockNumberDialogFragment extends DialogFragment {
/**
* Use a callback interface to update UI after success/undo. Favor this approach over other
@@ -49,17 +55,17 @@
public void onChangeFilteredNumberUndo();
}
- private static final String BLOCK_DIALOG_FRAGMENT = "blockUnblockNumberDialog";
+ private static final String BLOCK_DIALOG_FRAGMENT = "BlockNumberDialog";
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 mNumber;
private String mDisplayNumber;
- private String mNormalizedNumber;
+ private String mCountryIso;
private FilteredNumberAsyncQueryHandler mHandler;
private View mParentView;
@@ -67,28 +73,26 @@
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);
+ final BlockNumberDialogFragment newFragment = BlockNumberDialogFragment.newInstance(
+ blockId, number, countryIso, displayNumber, parentViewId);
newFragment.setCallback(callback);
- newFragment.show(fragmentManager, FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+ newFragment.show(fragmentManager, BlockNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
}
- private static FilterNumberDialogFragment newInstance(
+ private static BlockNumberDialogFragment newInstance(
Integer blockId,
- String normalizedNumber,
String number,
String countryIso,
String displayNumber,
Integer parentViewId) {
- final FilterNumberDialogFragment fragment = new FilterNumberDialogFragment();
+ final BlockNumberDialogFragment fragment = new BlockNumberDialogFragment();
final Bundle args = new Bundle();
if (blockId != null) {
args.putInt(ARG_BLOCK_ID, blockId.intValue());
@@ -96,7 +100,6 @@
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);
args.putString(ARG_DISPLAY_NUMBER, displayNumber);
@@ -109,12 +112,12 @@
super.onCreateDialog(savedInstanceState);
final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
+ mNumber = getArguments().getString(ARG_NUMBER);
mDisplayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
- if (TextUtils.isEmpty(mNormalizedNumber)) {
- String number = getArguments().getString(ARG_NUMBER);
- String countryIso = getArguments().getString(ARG_COUNTRY_ISO);
- mNormalizedNumber =
- FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso);
+ mCountryIso = getArguments().getString(ARG_COUNTRY_ISO);
+
+ if (TextUtils.isEmpty(mDisplayNumber)) {
+ mDisplayNumber = mNumber;
}
mHandler = new FilteredNumberAsyncQueryHandler(getContext().getContentResolver());
@@ -148,11 +151,9 @@
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- String number = getArguments().getString(ARG_NUMBER);
- if (TextUtils.isEmpty(mNormalizedNumber) ||
- !FilteredNumbersUtil.canBlockNumber(getActivity(), number)) {
+ if (!FilteredNumbersUtil.canBlockNumber(getActivity(), mNumber, mCountryIso)) {
dismiss();
- Toast.makeText(getContext(), getString(R.string.invalidNumber, number),
+ Toast.makeText(getContext(), getString(R.string.invalidNumber, mDisplayNumber),
Toast.LENGTH_SHORT).show();
}
}
@@ -187,6 +188,7 @@
final String undoMessage = getUnblockedMessage();
final Callback callback = mCallback;
final int actionTextColor = getActionTextColor();
+ final Context context = getContext();
final OnUnblockNumberListener onUndoListener = new OnUnblockNumberListener() {
@Override
@@ -217,14 +219,17 @@
if (callback != null) {
callback.onChangeFilteredNumberSuccess();
}
+
+ if (context != null && FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+ FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(context);
+ }
}
};
mHandler.blockNumber(
onBlockNumberListener,
- getArguments().getString(ARG_NORMALIZED_NUMBER),
- getArguments().getString(ARG_NUMBER),
- getArguments().getString(ARG_COUNTRY_ISO));
+ mNumber,
+ mCountryIso);
}
private void unblockNumber() {
diff --git a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
similarity index 90%
rename from src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
rename to src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
index 7777aeb..ad9e7a6 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
@@ -26,9 +26,9 @@
import com.android.dialer.calllog.ContactInfoHelper;
import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
-public class BlockedNumberAdapter extends NumberAdapter {
+public class BlockedNumbersAdapter extends NumbersAdapter {
- private BlockedNumberAdapter(
+ private BlockedNumbersAdapter(
Context context,
FragmentManager fragmentManager,
ContactInfoHelper contactInfoHelper,
@@ -36,9 +36,9 @@
super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
}
- public static BlockedNumberAdapter newBlockedNumberAdapter(
+ public static BlockedNumbersAdapter newBlockedNumbersAdapter(
Context context, FragmentManager fragmentManager) {
- return new BlockedNumberAdapter(
+ return new BlockedNumbersAdapter(
context,
fragmentManager,
new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
@@ -59,9 +59,8 @@
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- FilterNumberDialogFragment.show(
+ BlockNumberDialogFragment.show(
id,
- normalizedNumber,
number,
countryIso,
number,
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
index 7788cbe..a2a716f 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
@@ -15,6 +15,7 @@
*/
package com.android.dialer.filterednumber;
+import android.app.Activity;
import android.app.ListFragment;
import android.app.LoaderManager;
import android.content.Context;
@@ -35,7 +36,6 @@
import android.widget.Switch;
import com.android.dialer.R;
-import com.android.dialer.calllog.CallLogQueryHandler;
import com.android.dialer.database.FilteredNumberContract;
import com.android.dialer.filterednumber.FilteredNumbersUtil.CheckForSendToVoicemailContactListener;
import com.android.dialer.filterednumber.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
@@ -43,14 +43,11 @@
import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
public class BlockedNumbersFragment extends ListFragment
- implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener,
- CallLogQueryHandler.Listener {
+ implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
- private BlockedNumberAdapter mAdapter;
- private CallLogQueryHandler mCallLogQueryHandler;
+ private BlockedNumbersAdapter mAdapter;
private VoicemailStatusHelper mVoicemailStatusHelper;
- private Switch mHideSettingSwitch;
private View mImportSettings;
private View mBlockedNumbersDisabledForEmergency;
@@ -63,30 +60,20 @@
getListView().addHeaderView(inflater.inflate(R.layout.blocked_number_header, null));
if (mAdapter == null) {
- mAdapter = BlockedNumberAdapter.newBlockedNumberAdapter(
+ mAdapter = BlockedNumbersAdapter.newBlockedNumbersAdapter(
getContext(), getActivity().getFragmentManager());
}
setListAdapter(mAdapter);
- mCallLogQueryHandler
- = new CallLogQueryHandler(getContext(), getContext().getContentResolver(), this);
mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
- mHideSettingSwitch = (Switch) getActivity().findViewById(R.id.hide_blocked_calls_switch);
- mHideSettingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- FilteredNumbersUtil.setShouldHideBlockedCalls(getActivity(), isChecked);
- }
- });
-
mImportSettings = getActivity().findViewById(R.id.import_settings);
mBlockedNumbersDisabledForEmergency =
getActivity().findViewById(R.id.blocked_numbers_disabled_for_emergency);
getActivity().findViewById(R.id.import_button).setOnClickListener(this);;
getActivity().findViewById(R.id.view_numbers_button).setOnClickListener(this);
- getActivity().findViewById(R.id.add_number_button).setOnClickListener(this);
+ getActivity().findViewById(R.id.add_number_textview).setOnClickListener(this);
}
@Override
@@ -109,7 +96,6 @@
ColorDrawable backgroundDrawable =
new ColorDrawable(getActivity().getColor(R.color.dialer_theme_color));
actionBar.setBackgroundDrawable(backgroundDrawable);
- actionBar.setElevation(getResources().getDimensionPixelSize(R.dimen.action_bar_elevation));
actionBar.setDisplayShowCustomEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
@@ -125,9 +111,6 @@
}
});
- mHideSettingSwitch.setChecked(FilteredNumbersUtil.shouldHideBlockedCalls(getContext()));
- mCallLogQueryHandler.fetchVoicemailStatus();
-
if (FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) {
mBlockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
} else {
@@ -138,8 +121,7 @@
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.blocked_number_fragment, container, false);
- return view;
+ return inflater.inflate(R.layout.blocked_number_fragment, container, false);
}
@Override
@@ -170,21 +152,20 @@
@Override
public void onClick(final View view) {
- ManageBlockedNumbersActivity manageBlockedNumbersActivity =
- (ManageBlockedNumbersActivity) getActivity();
- if (manageBlockedNumbersActivity == null) {
+ BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
+ if (activity == null) {
return;
}
switch (view.getId()) {
- case R.id.add_number_button:
- manageBlockedNumbersActivity.enterSearchUi();
+ case R.id.add_number_textview:
+ activity.showSearchUi();
break;
case R.id.view_numbers_button:
- manageBlockedNumbersActivity.showNumbersToImportPreviewUi();
+ activity.showNumbersToImportPreviewUi();
break;
case R.id.import_button:
- FilteredNumbersUtil.importSendToVoicemailContacts(manageBlockedNumbersActivity,
+ FilteredNumbersUtil.importSendToVoicemailContacts(activity,
new ImportSendToVoicemailContactsListener() {
@Override
public void onImportComplete() {
@@ -194,32 +175,4 @@
break;
}
}
-
- @Override
- public void onVoicemailStatusFetched(Cursor cursor) {
- final View hideSetting = getActivity().findViewById(R.id.hide_blocked_calls_setting);
- if (cursor == null) {
- hideSetting.setVisibility(View.GONE);
- return;
- }
-
- final boolean hasVisualVoicemailSource =
- mVoicemailStatusHelper.getNumberActivityVoicemailSources(cursor) > 0;
- if (hasVisualVoicemailSource) {
- hideSetting.setVisibility(View.VISIBLE);
- } else {
- hideSetting.setVisibility(View.GONE);
- }
- }
-
- @Override
- public void onVoicemailUnreadCountFetched(Cursor cursor) {
- // Do nothing.
- }
-
- @Override
- public boolean onCallsFetched(Cursor cursor) {
- // Do nothing.
- return false;
- }
}
diff --git a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
similarity index 89%
rename from src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
rename to src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
index f785cf7..1735ce5 100644
--- a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
@@ -37,7 +37,7 @@
import com.android.dialer.list.BlockedListSearchFragment;
import com.android.dialer.list.SearchFragment;
-public class ManageBlockedNumbersActivity extends AppCompatActivity
+public class BlockedNumbersSettingsActivity extends AppCompatActivity
implements SearchFragment.HostInterface {
private static final String TAG_BLOCKED_MANAGEMENT_FRAGMENT = "blocked_management";
@@ -55,6 +55,9 @@
}
}
+ /**
+ * Shows fragment with the list of currently blocked numbers and settings related to blocking.
+ */
public void showManagementUi() {
BlockedNumbersFragment fragment = (BlockedNumbersFragment) getFragmentManager()
.findFragmentByTag(TAG_BLOCKED_MANAGEMENT_FRAGMENT);
@@ -68,7 +71,10 @@
.commit();
}
- public void enterSearchUi() {
+ /**
+ * Shows fragment with search UI for browsing/finding numbers to block.
+ */
+ public void showSearchUi() {
BlockedListSearchFragment fragment = (BlockedListSearchFragment) getFragmentManager()
.findFragmentByTag(TAG_BLOCKED_SEARCH_FRAGMENT);
if (fragment == null) {
@@ -85,6 +91,11 @@
.commit();
}
+ /**
+ * Shows fragment with UI to preview the numbers of contacts currently marked as
+ * send-to-voicemail in Contacts. These numbers can be imported into Dialer's blocked number
+ * list.
+ */
public void showNumbersToImportPreviewUi() {
ViewNumbersToImportFragment fragment = (ViewNumbersToImportFragment) getFragmentManager()
.findFragmentByTag(TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT);
@@ -120,7 +131,7 @@
@Override
public boolean isActionBarShowing() {
- return true;
+ return false;
}
@Override
@@ -135,11 +146,11 @@
@Override
public int getActionBarHideOffset() {
- return getSupportActionBar().getHideOffset();
+ return 0;
}
@Override
public int getActionBarHeight() {
- return getSupportActionBar().getHeight();
+ return 0;
}
}
diff --git a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
index 45fa6b7..4cc8e75 100644
--- a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
+++ b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
@@ -15,8 +15,12 @@
*/
package com.android.dialer.filterednumber;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.ContentValues;
import android.content.Context;
+import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
@@ -35,6 +39,7 @@
import com.android.contacts.common.testing.NeededForTesting;
import com.android.dialer.R;
import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
@@ -43,13 +48,20 @@
*/
public class FilteredNumbersUtil {
- private static final String HIDE_BLOCKED_CALLS_PREF_KEY = "hide_blocked_calls";
- // Pref key for storing the time, in milliseconds after epoch, of end of the last emergency call.
- private static final String LAST_EMERGENCY_CALL_PREF_KEY = "last_emergency_call";
-
// Disable incoming call blocking if there was a call within the past 2 days.
private static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = 1000 * 60 * 60 * 24 * 2;
+ // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.
+ private static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
+
+ // Pref key for storing whether a notification has been dispatched to notify the user that call
+ // blocking has been disabled because of a recent emergency call.
+ private static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY =
+ "notified_call_blocking_disabled_by_emergency_call";
+
+ public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking";
+ public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10;
+
/**
* Used for testing to specify that a custom threshold should be used instead of the default.
* This custom threshold will only be used when setting this log tag to VERBOSE:
@@ -221,7 +233,7 @@
* Use {@code FilteredNumberAsyncQueryHandler} to asynchronously check if a number is blocked.
*/
public static boolean shouldBlockVoicemail(
- Context context, String number, String countryIso, long dateMs) {
+ Context context, String number, String countryIso, long voicemailDateMs) {
final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
if (TextUtils.isEmpty(normalizedNumber)) {
return false;
@@ -239,10 +251,11 @@
boolean shouldBlock = false;
if (cursor != null) {
try {
- cursor.moveToFirst();
-
- // Block if number is found and it was added before this voicemail was received.
- shouldBlock = cursor.getCount() > 0 && dateMs > cursor.getLong(0);
+ if (cursor.moveToFirst()) {
+ // Block if number is found and it was added before this voicemail was received.
+ final long numberBlockedTimeMs = cursor.getLong(0);
+ shouldBlock = cursor.getCount() > 0 && voicemailDateMs > numberBlockedTimeMs;
+ }
} finally {
cursor.close();
}
@@ -251,31 +264,13 @@
return shouldBlock;
}
- public static boolean shouldHideBlockedCalls(Context context) {
- if (context == null) {
- return false;
- }
- return PreferenceManager.getDefaultSharedPreferences(context)
- .getBoolean(FilteredNumbersUtil.HIDE_BLOCKED_CALLS_PREF_KEY, false);
- }
-
- public static void setShouldHideBlockedCalls(Context context, boolean shouldHide) {
- if (context == null) {
- return;
- }
- PreferenceManager.getDefaultSharedPreferences(context)
- .edit()
- .putBoolean(HIDE_BLOCKED_CALLS_PREF_KEY, shouldHide)
- .apply();
- }
-
public static boolean hasRecentEmergencyCall(Context context) {
if (context == null) {
return false;
}
Long lastEmergencyCallTime = PreferenceManager.getDefaultSharedPreferences(context)
- .getLong(LAST_EMERGENCY_CALL_PREF_KEY, 0);
+ .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
if (lastEmergencyCallTime == 0) {
return false;
}
@@ -288,14 +283,66 @@
if (context == null) {
return;
}
+
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
- .putLong(LAST_EMERGENCY_CALL_PREF_KEY, System.currentTimeMillis())
+ .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
+ .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
.apply();
+
+ maybeNotifyCallBlockingDisabled(context);
}
- public static boolean canBlockNumber(Context context, String number) {
- return !PhoneNumberUtils.isEmergencyNumber(number) && !TextUtils.isEmpty(number);
+ public static void maybeNotifyCallBlockingDisabled(final Context context) {
+ // Skip if the user has already received a notification for the most recent emergency call.
+ if (PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)) {
+ return;
+ }
+
+ // If the user has blocked numbers, notify that call blocking is temporarily disabled.
+ FilteredNumberAsyncQueryHandler queryHandler =
+ new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+ queryHandler.hasBlockedNumbers(new OnHasBlockedNumbersListener() {
+ @Override
+ public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
+ if (context == null || !hasBlockedNumbers) {
+ return;
+ }
+
+ NotificationManager notificationManager = (NotificationManager)
+ context.getSystemService(Context.NOTIFICATION_SERVICE);
+ Notification.Builder builder = new Notification.Builder(context)
+ .setSmallIcon(R.drawable.ic_block_24dp)
+ .setContentTitle(context.getString(
+ R.string.call_blocking_disabled_notification_title))
+ .setContentText(context.getString(
+ R.string.call_blocking_disabled_notification_text))
+ .setAutoCancel(true);
+
+ final Intent contentIntent =
+ new Intent(context, BlockedNumbersSettingsActivity.class);
+ builder.setContentIntent(PendingIntent.getActivity(
+ context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+
+ notificationManager.notify(
+ CALL_BLOCKING_NOTIFICATION_TAG,
+ CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID,
+ builder.build());
+
+ // Record that the user has been notified for this emergency call.
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true)
+ .apply();
+ }
+ });
+ }
+
+ public static boolean canBlockNumber(Context context, String number, String countryIso) {
+ final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ return !TextUtils.isEmpty(normalizedNumber)
+ && !PhoneNumberUtils.isEmergencyNumber(normalizedNumber);
}
private static long getRecentEmergencyCallThresholdMs(Context context) {
diff --git a/src/com/android/dialer/filterednumber/NumberAdapter.java b/src/com/android/dialer/filterednumber/NumbersAdapter.java
similarity index 98%
rename from src/com/android/dialer/filterednumber/NumberAdapter.java
rename to src/com/android/dialer/filterednumber/NumbersAdapter.java
index b212fa3..1706107 100644
--- a/src/com/android/dialer/filterednumber/NumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/NumbersAdapter.java
@@ -36,7 +36,7 @@
import com.android.dialer.calllog.ContactInfoHelper;
import com.android.dialer.util.PhoneNumberUtil;
-public class NumberAdapter extends SimpleCursorAdapter {
+public class NumbersAdapter extends SimpleCursorAdapter {
private Context mContext;
private FragmentManager mFragmentManager;
@@ -45,7 +45,7 @@
private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
private ContactPhotoManager mContactPhotoManager;
- public NumberAdapter(
+ public NumbersAdapter(
Context context,
FragmentManager fragmentManager,
ContactInfoHelper contactInfoHelper,
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
index 40b81c7..58fe1d4 100644
--- a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
@@ -25,7 +25,7 @@
import com.android.dialer.R;
import com.android.dialer.calllog.ContactInfoHelper;
-public class ViewNumbersToImportAdapter extends NumberAdapter {
+public class ViewNumbersToImportAdapter extends NumbersAdapter {
private ViewNumbersToImportAdapter(
Context context,
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
index 947dc67..9912416 100644
--- a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
@@ -72,6 +72,10 @@
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
actionBar.setTitle(R.string.import_send_to_voicemail_numbers_label);
+ actionBar.setDisplayShowCustomEnabled(false);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
getActivity().findViewById(R.id.cancel_button).setOnClickListener(this);
getActivity().findViewById(R.id.import_button).setOnClickListener(this);
diff --git a/src/com/android/dialer/list/BlockedListSearchAdapter.java b/src/com/android/dialer/list/BlockedListSearchAdapter.java
index aaea40b..1618826 100644
--- a/src/com/android/dialer/list/BlockedListSearchAdapter.java
+++ b/src/com/android/dialer/list/BlockedListSearchAdapter.java
@@ -84,7 +84,7 @@
}
}
};
- mFilteredNumberAsyncQueryHandler.startBlockedQuery(
- onCheckListener, null, number, countryIso);
+ mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ onCheckListener, number, countryIso);
}
}
diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java
index 8fc6f7a..08a9c49 100644
--- a/src/com/android/dialer/list/BlockedListSearchFragment.java
+++ b/src/com/android/dialer/list/BlockedListSearchFragment.java
@@ -15,13 +15,11 @@
*/
package com.android.dialer.list;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
+import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.util.TypedValue;
@@ -31,23 +29,25 @@
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.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;
-import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
import com.android.dialer.widget.SearchEditTextLayout;
public class BlockedListSearchFragment extends RegularSearchFragment
- implements FilterNumberDialogFragment.Callback {
+ implements BlockNumberDialogFragment.Callback {
private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
+ private static final String KEY_SEARCH_QUERY = "search_query";
+
private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
private EditText mSearchView;
+ private String mSearchQuery;
private final TextWatcher mPhoneSearchQueryTextListener = new TextWatcher() {
@Override
@@ -56,7 +56,8 @@
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
- setQueryString(s.toString(), false);
+ mSearchQuery = s.toString();
+ setQueryString(mSearchQuery, false);
}
@Override
@@ -76,7 +77,6 @@
}
};
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -86,6 +86,9 @@
mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(
getContext().getContentResolver());
+ if (savedInstanceState != null) {
+ mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
+ }
}
@Override
@@ -94,8 +97,6 @@
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
actionBar.setCustomView(R.layout.search_edittext);
- actionBar.setBackgroundDrawable(null);
- actionBar.setElevation(0);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
@@ -104,21 +105,37 @@
.getCustomView().findViewById(R.id.search_view_container);
searchEditTextLayout.expand(false, true);
searchEditTextLayout.setCallback(mSearchLayoutCallback);
+ searchEditTextLayout.setBackgroundDrawable(null);
mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view);
mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
mSearchView.setHint(R.string.block_number_search_hint);
+ searchEditTextLayout.findViewById(R.id.search_box_expanded)
+ .setBackgroundColor(getContext().getResources().getColor(android.R.color.white));
+
+ if (!TextUtils.isEmpty(mSearchQuery)) {
+ mSearchView.setText(mSearchQuery);
+ }
+
// TODO: Don't set custom text size; use default search text size.
mSearchView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimension(R.dimen.blocked_number_search_text_size));
}
@Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(KEY_SEARCH_QUERY, getAdapter().getQueryString());
+ }
+
+ @Override
protected ContactEntryListAdapter createListAdapter() {
BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity());
adapter.setDisplayPhotos(true);
- adapter.setUseCallableUri(usesCallableUri());
+ // Don't show SIP addresses.
+ adapter.setUseCallableUri(false);
+ adapter.setQueryString(mSearchQuery);
return adapter;
}
@@ -158,9 +175,8 @@
@Override
public void onCheckComplete(Integer id) {
if (id == null) {
- FilterNumberDialogFragment.show(
+ BlockNumberDialogFragment.show(
id,
- null,
number,
countryIso,
number,
@@ -173,9 +189,9 @@
}
}
};
- boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
- onCheckListener, null, number, countryIso);
- if (failed) {
+ final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ onCheckListener, number, countryIso);
+ if (!success) {
Toast.makeText(getContext(), getString(R.string.invalidNumber, number),
Toast.LENGTH_SHORT).show();
}
@@ -183,12 +199,11 @@
@Override
public void onChangeFilteredNumberSuccess() {
- ManageBlockedNumbersActivity activity = (ManageBlockedNumbersActivity) getActivity();
+ BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
if (activity == null) {
return;
}
-
- activity.showManagementUi();
+ activity.onBackPressed();
}
@Override
@@ -207,9 +222,8 @@
return;
}
- FilterNumberDialogFragment.show(
+ BlockNumberDialogFragment.show(
blockId,
- null,
number,
GeoUtil.getCurrentCountryIso(getContext()),
number,
diff --git a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
index 05780c6..c12bed7 100644
--- a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
@@ -95,6 +95,11 @@
setMeasuredDimension(width, height);
}
+ @Override
+ protected String getNameForView(ContactEntry contactEntry) {
+ return contactEntry.getPreferredDisplayName();
+ }
+
public ContactEntry getContactEntry() {
return mContactEntry;
}
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index e957c83..cd4c10b 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -38,13 +38,13 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.common.list.ContactEntry;
import com.android.contacts.common.list.ContactTileAdapter.DisplayType;
import com.android.contacts.common.list.ContactTileView;
+import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.R;
import java.util.ArrayList;
@@ -70,6 +70,7 @@
private Context mContext;
private Resources mResources;
+ private ContactsPreferences mContactsPreferences;
/** Contact data stored in cache. This is used to populate the associated view. */
protected ArrayList<ContactEntry> mContactEntries = null;
@@ -92,7 +93,8 @@
protected int mIdIndex;
protected int mLookupIndex;
protected int mPhotoUriIndex;
- protected int mNameIndex;
+ protected int mNamePrimaryIndex;
+ protected int mNameAlternativeIndex;
protected int mPresenceIndex;
protected int mStatusIndex;
@@ -124,9 +126,17 @@
public int compare(ContactEntry lhs, ContactEntry rhs) {
return ComparisonChain.start()
.compare(lhs.pinned, rhs.pinned)
- .compare(lhs.name, rhs.name)
+ .compare(getPreferredSortName(lhs), getPreferredSortName(rhs))
.result();
}
+
+ private String getPreferredSortName(ContactEntry contactEntry) {
+ if (mContactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
+ || TextUtils.isEmpty(contactEntry.nameAlternative)) {
+ return contactEntry.namePrimary;
+ }
+ return contactEntry.nameAlternative;
+ }
};
public interface OnDataSetChangedForAnimationListener {
@@ -140,6 +150,7 @@
mListener = listener;
mContext = context;
mResources = context.getResources();
+ mContactsPreferences = new ContactsPreferences(mContext);
mNumFrequents = 0;
mContactEntries = new ArrayList<ContactEntry>();
@@ -172,19 +183,26 @@
*/
protected void bindColumnIndices() {
mIdIndex = ContactTileLoaderFactory.CONTACT_ID;
- mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
- mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
- mNameIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+ mNamePrimaryIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+ mNameAlternativeIndex = ContactTileLoaderFactory.DISPLAY_NAME_ALTERNATIVE;
mStarredIndex = ContactTileLoaderFactory.STARRED;
- mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
- mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
-
+ mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
+ mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
mPhoneNumberIndex = ContactTileLoaderFactory.PHONE_NUMBER;
mPhoneNumberTypeIndex = ContactTileLoaderFactory.PHONE_NUMBER_TYPE;
mPhoneNumberLabelIndex = ContactTileLoaderFactory.PHONE_NUMBER_LABEL;
- mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
mPinnedIndex = ContactTileLoaderFactory.PINNED;
- mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID_FOR_DATA;
+ mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID;
+
+
+ mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
+ mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
+ mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
+ }
+
+ public void refreshContactsPreferences() {
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
}
/**
@@ -261,15 +279,19 @@
final String photoUri = cursor.getString(mPhotoUriIndex);
final String lookupKey = cursor.getString(mLookupIndex);
final int pinned = cursor.getInt(mPinnedIndex);
- final String name = cursor.getString(mNameIndex);
+ final String name = cursor.getString(mNamePrimaryIndex);
+ final String nameAlternative = cursor.getString(mNameAlternativeIndex);
final boolean isStarred = cursor.getInt(mStarredIndex) > 0;
final boolean isDefaultNumber = cursor.getInt(mIsDefaultNumberIndex) > 0;
final ContactEntry contact = new ContactEntry();
contact.id = id;
- contact.name = (!TextUtils.isEmpty(name)) ? name :
+ contact.namePrimary = (!TextUtils.isEmpty(name)) ? name :
mResources.getString(R.string.missing_name);
+ contact.nameAlternative = (!TextUtils.isEmpty(nameAlternative)) ? nameAlternative :
+ mResources.getString(R.string.missing_name);
+ contact.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
contact.lookupKey = lookupKey;
contact.lookupUri = ContentUris.withAppendedId(
diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java
index 64129cd..e30f406 100644
--- a/src/com/android/dialer/list/SpeedDialFragment.java
+++ b/src/com/android/dialer/list/SpeedDialFragment.java
@@ -202,7 +202,9 @@
public void onResume() {
Trace.beginSection(TAG + " onResume");
super.onResume();
-
+ if (mContactTileAdapter != null) {
+ mContactTileAdapter.refreshContactsPreferences();
+ }
if (PermissionsUtil.hasContactsPermissions(getActivity())) {
if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null,
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index 6fcd221..d0bfbc2 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -28,7 +28,7 @@
import android.widget.Toast;
import com.android.dialer.R;
-import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
import java.util.List;
@@ -88,7 +88,7 @@
Header blockedCallsHeader = new Header();
blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
- blockedCallsHeader.intent = new Intent(this, ManageBlockedNumbersActivity.class);
+ blockedCallsHeader.intent = new Intent(this, BlockedNumbersSettingsActivity.class);
target.add(blockedCallsHeader);
if (telephonyManager.isTtyModeSupported()
diff --git a/src/com/android/dialer/widget/SearchEditTextLayout.java b/src/com/android/dialer/widget/SearchEditTextLayout.java
index 544749f..4f100dc 100644
--- a/src/com/android/dialer/widget/SearchEditTextLayout.java
+++ b/src/com/android/dialer/widget/SearchEditTextLayout.java
@@ -230,7 +230,6 @@
setElevation(0);
setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom);
- setElevation(0);
if (requestFocus) {
mSearchView.requestFocus();
}
diff --git a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
index d0547bd..8819384 100644
--- a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
+++ b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
@@ -1,5 +1,8 @@
package com.android.dialer.list;
+import com.google.common.collect.Lists;
+
+import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.provider.ContactsContract.PinnedPositions;
@@ -8,15 +11,18 @@
import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.common.list.ContactEntry;
+import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.list.PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener;
+import junit.framework.Assert;
+
import java.util.ArrayList;
@SmallTest
public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
- private PhoneFavoritesTileAdapter mAdapter;
- private static final OnDataSetChangedForAnimationListener
- sOnDataSetChangedForAnimationListener = new OnDataSetChangedForAnimationListener() {
+
+ private static final OnDataSetChangedForAnimationListener NOOP_ANIMATION_LISTENER =
+ new OnDataSetChangedForAnimationListener() {
@Override
public void onDataSetChangedForAnimation(long... idsInPlace) {}
@@ -24,18 +30,161 @@
public void cacheOffsetsForDatasetChange() {}
};
- /**
- * TODO: Add tests
- *
- * Test cases (various combinations of):
- * No pinned contacts
- * One pinned contact
- * Multiple pinned contacts with differing pinned positions
- * Multiple pinned contacts with conflicting pinned positions
- * Pinned contacts with pinned positions at the start, middle, end, and outside the list
- */
- public void testArrangeContactsByPinnedPosition() {
+ private PhoneFavoritesTileAdapter mAdapter;
+ @Override
+ public void setUp() {
+ this.mAdapter = new PhoneFavoritesTileAdapter(getContext(), null, NOOP_ANIMATION_LISTENER);
+ }
+
+ /**
+ * For all arrangeContactsByPinnedPosition tests, the id for a particular ContactEntry
+ * represents the index at which it should be located after calling
+ * arrangeContactsByPinnedPosition
+ */
+
+ public void testArrangeContactsByPinnedPosition_NoPinned() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(1), getTestContactEntry(2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_NoPinned_RemoveDemoted() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 2);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_Beginning() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1),
+ getTestContactEntry(0, 1), getTestContactEntry(2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_Middle() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(1, 2), getTestContactEntry(2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_End() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(2, 3), getTestContactEntry(1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_Outside() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(2, 5), getTestContactEntry(1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_RemoveDemoted() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 2);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Split() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+ getTestContactEntry(1), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Adjacent() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedBefore() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0), getTestContactEntry(2, 2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedAfter() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+ getTestContactEntry(2), getTestContactEntry(1, 1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_RemoveDemoted() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0, 2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 2);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0, 1), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsFirst() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0, 2), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsLast() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 2),
+ getTestContactEntry(1, 3), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned_AllConflicts() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(2, 3),
+ getTestContactEntry(1, 3), getTestContactEntry(0, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_All_Pinned_AllConflicts_SortNameAlternative() {
+ Context context = getContext();
+ context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit()
+ .putInt(ContactsPreferences.SORT_ORDER_KEY,
+ ContactsPreferences.SORT_ORDER_ALTERNATIVE)
+ .commit();
+ ArrayList<ContactEntry> actual = Lists.newArrayList(
+ getTestContactEntry(1, 3, "2", "1"),
+ getTestContactEntry(2, 3, "0", "2"),
+ getTestContactEntry(0, 3, "1", "0")
+ );
+ mAdapter.arrangeContactsByPinnedPosition(actual);
+
+ assertContactEntryListPositionsMatchId(actual, 3);
}
/**
@@ -55,6 +204,45 @@
}
+ public void testSetContactCursor_DisplayNameOrder_Primary() {
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+ Cursor testCursor = getCursorForTest(1, 0);
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+ }
+
+ public void testSetContactCursor_DisplayNameOrder_Alternative() {
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+ Cursor testCursor = getCursorForTest(1, 0);
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+ }
+
+ public void testSetContactCursor_DisplayNameOrder_Changed() {
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+ Cursor testCursor = getCursorForTest(1, 0);
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+ mAdapter.refreshContactsPreferences();
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+ }
+
+ private void setNameDisplayOrder(Context context, int displayOrder) {
+ context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit().putInt(
+ ContactsPreferences.DISPLAY_ORDER_KEY, displayOrder).commit();
+ }
+
/**
* Returns a cursor containing starred and frequent contacts for test purposes.
*
@@ -72,38 +260,42 @@
// The only field that really matters for testing is the contact id.
for (int i = 0; i < numStarred; i++) {
c.addRow(new Object[] {countId, null, 1, null, null, 0, 0, null, 0,
- PinnedPositions.UNPINNED, countId});
+ PinnedPositions.UNPINNED, countId, null});
countId++;
}
// Add frequent contact entries. These entries have the starred field set to 0 (false).
for (int i = 0; i < numFrequents; i++) {
c.addRow(new Object[] {countId, null, 0, null, null, 0, 0, null, 0,
- PinnedPositions.UNPINNED, countId});
+ PinnedPositions.UNPINNED, countId, null});
countId++;
}
return c;
}
- /**
- * Returns a ContactEntry with test data corresponding to the provided contact Id
- *
- * @param id Non-negative id
- * @return ContactEntry item used for testing
- */
- private ContactEntry getTestContactEntry(int id, boolean isFavorite) {
+ private ContactEntry getTestContactEntry(int id) {
+ return getTestContactEntry(id, PinnedPositions.UNPINNED);
+ }
+
+ private ContactEntry getTestContactEntry(int id, int pinned) {
+ return getTestContactEntry(id, pinned, String.valueOf(id), String.valueOf(id));
+ }
+
+ private ContactEntry getTestContactEntry(int id, int pinned, String namePrimaryAppend,
+ String nameAlternativeAppend) {
ContactEntry contactEntry = new ContactEntry();
contactEntry.id = id;
- contactEntry.isFavorite = isFavorite;
+ contactEntry.pinned = pinned;
+ contactEntry.namePrimary = namePrimaryAppend;
+ contactEntry.nameAlternative = nameAlternativeAppend;
return contactEntry;
}
- private void assertContactEntryRowsEqual(ArrayList<ContactEntry> expected,
- ArrayList<ContactEntry> actual) {
- assertEquals(expected.size(), actual.size());
- for (int i = 0; i < actual.size(); i++) {
- assertEquals(expected.get(i).id, actual.get(i).id);
- assertEquals(expected.get(i).isFavorite, actual.get(i).isFavorite);
+ private void assertContactEntryListPositionsMatchId(ArrayList<ContactEntry> contactEntries,
+ int expectedSize) {
+ Assert.assertEquals(expectedSize, contactEntries.size());
+ for (int i = 0; i < expectedSize; ++i) {
+ Assert.assertEquals(i, contactEntries.get(i).id);
}
}
}