From bf5cb80991de5725a5c35a11016c1508eaec3cb4 Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Thu, 24 Mar 2016 17:02:27 -0700 Subject: Add spam indicator for notification and incoming call of incallui. + Add spam icon and label in notification of incoming call. + Add spam icon and label in primary call info of incall screen. + Change background color and status bar color if primary caller is spam. Screenshots: https://screenshot.googleplex.com/WFob2oPdXZd https://screenshot.googleplex.com/ddCfg91Anef Bug: 27611253 Change-Id: I03b3754f69631f5f6b07932b1a0006407b93c6e8 --- InCallUI/res/layout/primary_call_info.xml | 8 +++++ InCallUI/res/values/colors.xml | 5 +++ InCallUI/res/values/strings.xml | 4 +++ InCallUI/src/com/android/incallui/Call.java | 10 ++++++ .../src/com/android/incallui/CallCardFragment.java | 15 ++++++++ .../com/android/incallui/CallCardPresenter.java | 6 ++++ InCallUI/src/com/android/incallui/CallList.java | 19 +++++++--- .../src/com/android/incallui/InCallPresenter.java | 12 +++++-- .../com/android/incallui/StatusBarNotifier.java | 13 ++++++- res/values/colors.xml | 2 +- .../dialer/service/ExtendedCallInfoService.java | 41 ++++++++++++++++++++++ src/com/android/dialerbind/ObjectFactory.java | 6 ++++ 12 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 src/com/android/dialer/service/ExtendedCallInfoService.java diff --git a/InCallUI/res/layout/primary_call_info.xml b/InCallUI/res/layout/primary_call_info.xml index 3eb363026..56291bcc4 100644 --- a/InCallUI/res/layout/primary_call_info.xml +++ b/InCallUI/res/layout/primary_call_info.xml @@ -163,6 +163,14 @@ android:scaleType="fitCenter" android:visibility="gone" /> + + #7B1FA2 #C2185B #C53929 + #A52714 + #A52714 + #40000000 diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml index 57a1b5389..9534c0e42 100644 --- a/InCallUI/res/values/strings.xml +++ b/InCallUI/res/values/strings.xml @@ -169,6 +169,8 @@ Incoming Wi-Fi work call Incoming video call + + Incoming suspected spam call Incoming video request @@ -523,4 +525,6 @@ Open now Closed now + + Suspected spam caller diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java index 54ec52829..483d53e64 100644 --- a/InCallUI/src/com/android/incallui/Call.java +++ b/InCallUI/src/com/android/incallui/Call.java @@ -389,6 +389,16 @@ public class Call { private LogState mLogState = new LogState(); + private boolean mIsSpam; + + public void setSpam(boolean isSpam) { + mIsSpam = isSpam; + } + + public boolean isSpam() { + return mIsSpam; + } + /** * Used only to create mock calls for testing */ diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java index 785d3d3aa..54b37e578 100644 --- a/InCallUI/src/com/android/incallui/CallCardFragment.java +++ b/InCallUI/src/com/android/incallui/CallCardFragment.java @@ -130,6 +130,7 @@ public class CallCardFragment extends BaseFragment getUi().showHdAudioIndicator(showHdAudioIndicator); } + private void maybeShowSpamIconAndLabel() { + getUi().showSpamIndicator(mPrimary.isSpam()); + } + /** * Only show the conference call button if we can manage the conference. */ @@ -826,6 +830,7 @@ public class CallCardPresenter extends Presenter boolean isEmergencyCall = mPrimary.isEmergencyCall(); mEmergencyCallListener.onCallUpdated((BaseFragment) ui, isEmergencyCall); } + maybeShowSpamIconAndLabel(); } private void updateSecondaryDisplayInfo() { @@ -1162,6 +1167,7 @@ public class CallCardPresenter extends Presenter void setProgressSpinnerVisible(boolean visible); void showHdAudioIndicator(boolean visible); void showForwardIndicator(boolean visible); + void showSpamIndicator(boolean visible); void showManageConferenceCallButton(boolean visible); boolean isManageConferenceVisible(); boolean isCallSubjectVisible(); diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java index d0f3c1000..a3a9d743e 100644 --- a/InCallUI/src/com/android/incallui/CallList.java +++ b/InCallUI/src/com/android/incallui/CallList.java @@ -23,8 +23,8 @@ import android.telecom.DisconnectCause; import android.telecom.PhoneAccount; import com.android.contacts.common.testing.NeededForTesting; -import com.android.dialer.database.FilteredNumberAsyncQueryHandler; import com.android.dialer.logging.Logger; +import com.android.dialer.service.ExtendedCallInfoService; import com.android.incallui.util.TelecomCallUtil; import com.google.common.base.Preconditions; @@ -69,7 +69,7 @@ public class CallList { .newHashMap(); private final Set mPendingDisconnectCalls = Collections.newSetFromMap( new ConcurrentHashMap(8, 0.9f, 1)); - private FilteredNumberAsyncQueryHandler mFilteredQueryHandler; + private ExtendedCallInfoService mExtendedCallInfoService; /** * Static singleton accessor method. @@ -94,6 +94,17 @@ public class CallList { if (call.getState() == Call.State.INCOMING || call.getState() == Call.State.CALL_WAITING) { onIncoming(call, call.getCannedSmsResponses()); + if (mExtendedCallInfoService != null) { + String number = TelecomCallUtil.getNumber(telecomCall); + mExtendedCallInfoService.getExtendedCallInfo(number, + new ExtendedCallInfoService.Listener() { + @Override + public void onComplete(boolean isSpam) { + call.setSpam(isSpam); + onUpdate(call); + } + }); + } } else { onUpdate(call); } @@ -615,8 +626,8 @@ public class CallList { } }; - public void setFilteredNumberQueryHandler(FilteredNumberAsyncQueryHandler handler) { - mFilteredQueryHandler = handler; + public void setExtendedCallInfoService(ExtendedCallInfoService service) { + mExtendedCallInfoService = service; } /** diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java index 5a27b4ca0..2a3fd3ed7 100644 --- a/InCallUI/src/com/android/incallui/InCallPresenter.java +++ b/InCallUI/src/com/android/incallui/InCallPresenter.java @@ -341,7 +341,8 @@ public class InCallPresenter implements CallList.Listener, mFilteredQueryHandler = new FilteredNumberAsyncQueryHandler(context.getContentResolver()); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); - mCallList.setFilteredNumberQueryHandler(mFilteredQueryHandler); + mCallList.setExtendedCallInfoService( + com.android.dialerbind.ObjectFactory.newExtendedCallInfoService(context)); Log.d(this, "Finished InCallPresenter.setUp"); } @@ -1744,7 +1745,14 @@ public class InCallPresenter implements CallList.Listener, if (call == null) { return getColorsFromPhoneAccountHandle(mPendingPhoneAccountHandle); } else { - return getColorsFromPhoneAccountHandle(call.getAccountHandle()); + if (call.isSpam()) { + Resources resources = mContext.getResources(); + return new InCallUIMaterialColorMapUtils( + resources).calculatePrimaryAndSecondaryColor( + resources.getColor(R.color.incall_call_spam_background_color)); + } else { + return getColorsFromPhoneAccountHandle(call.getAccountHandle()); + } } } diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java index 7d212aa8e..21bf38970 100644 --- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java +++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java @@ -33,7 +33,9 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.media.AudioAttributes; import android.net.Uri; import android.provider.ContactsContract.Contacts; @@ -52,6 +54,7 @@ import com.android.contacts.common.testing.NeededForTesting; import com.android.contacts.common.util.BitmapUtil; import com.android.contacts.common.util.ContactDisplayUtils; import com.android.dialer.R; +import com.android.dialer.service.ExtendedCallInfoService; import com.android.incallui.ContactInfoCache.ContactCacheEntry; import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback; import com.android.incallui.InCallPresenter.InCallState; @@ -463,6 +466,10 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) { largeIcon = ((BitmapDrawable) contactInfo.photo).getBitmap(); } + if (call.isSpam()) { + Drawable drawable = mContext.getResources().getDrawable(R.drawable.blocked_contact); + largeIcon = CallCardFragment.drawableToBitmap(drawable); + } return largeIcon; } @@ -524,7 +531,11 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, if (call.hasProperty(Details.PROPERTY_WIFI)) { resId = R.string.notification_incoming_call_wifi; } else { - resId = R.string.notification_incoming_call; + if (call.isSpam()) { + resId = R.string.notification_incoming_spam_call; + } else { + resId = R.string.notification_incoming_call; + } } } else if (call.getState() == Call.State.ONHOLD) { resId = R.string.notification_on_hold; diff --git a/res/values/colors.xml b/res/values/colors.xml index 38fd6b39a..f2cbea1fa 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -124,7 +124,7 @@ #D8D8D8 - @android:color/holo_red_dark + #A52714 @color/dialtacts_primary_text_color @color/dialtacts_secondary_text_color #616161 diff --git a/src/com/android/dialer/service/ExtendedCallInfoService.java b/src/com/android/dialer/service/ExtendedCallInfoService.java new file mode 100644 index 000000000..33a85f485 --- /dev/null +++ b/src/com/android/dialer/service/ExtendedCallInfoService.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.service; + +/** + * Interface of service to get extended call information. + */ +public interface ExtendedCallInfoService { + + /** + * Interface for a callback to be invoked when data is fetched. + */ + interface Listener { + /** + * Called when data is fetched. + * @param isSpam True if the call is spam. + */ + void onComplete(boolean isSpam); + } + + /** + * Gets extended call information. + * @param number The phone number of the call. + * @param listener The callback to be invoked after {@code Info} is fetched. + */ + void getExtendedCallInfo(String number, Listener listener); +} diff --git a/src/com/android/dialerbind/ObjectFactory.java b/src/com/android/dialerbind/ObjectFactory.java index 303610f30..4703347ad 100644 --- a/src/com/android/dialerbind/ObjectFactory.java +++ b/src/com/android/dialerbind/ObjectFactory.java @@ -27,6 +27,7 @@ import com.android.dialer.list.RegularSearchFragment; import com.android.dialer.logging.Logger; import com.android.dialer.service.CachedNumberLookupService; import com.android.dialer.service.ExtendedBlockingButtonRenderer; +import com.android.dialer.service.ExtendedCallInfoService; import com.android.dialer.voicemail.VoicemailPlaybackPresenter; /** @@ -65,6 +66,11 @@ public class ObjectFactory { return null; } + @Nullable + public static ExtendedCallInfoService newExtendedCallInfoService(Context context) { + return null; + } + /** * Create a new instance of the call log adapter. * @param context The context to use. -- cgit v1.2.3