Optimization for incoming call latency.
There are many binder call triggered by IPC on main thread. This change will try to reduce them by caching thing that's bound to a call. It reduce total binder transaction from 1002 to 664 and saves ~11% latency of incoming call on locked screen.
1. Cache isVoiceMailNumber in DialerCall
2. Cache call capable accounts in DialerCall
3. Cache current country iso in DialerCall
4. Don't set orientation change if it's not changed.
This change also add lots of trace info. It won't affect release build though since they are stripped out by proguard.
Bug: 64542087
Test: manual
PiperOrigin-RevId: 171901266
Change-Id: Iec48f030529aa59974212147276f6d0ae121872a
diff --git a/java/com/android/dialer/location/GeoUtil.java b/java/com/android/dialer/location/GeoUtil.java
index b39256d..27fbf23 100644
--- a/java/com/android/dialer/location/GeoUtil.java
+++ b/java/com/android/dialer/location/GeoUtil.java
@@ -17,6 +17,7 @@
package com.android.dialer.location;
import android.content.Context;
+import android.os.Trace;
/** Static methods related to Geo. */
public class GeoUtil {
@@ -24,6 +25,9 @@
/** @return the ISO 3166-1 two letters country code of the country the user is in. */
public static String getCurrentCountryIso(Context context) {
// The {@link CountryDetector} should never return null so this is safe to return as-is.
- return CountryDetector.getInstance(context).getCurrentCountryIso();
+ Trace.beginSection("GeoUtil.getCurrentCountryIso");
+ String countryIso = CountryDetector.getInstance(context).getCurrentCountryIso();
+ Trace.endSection();
+ return countryIso;
}
}
diff --git a/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java b/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
index b25e4d7..cc9b730 100644
--- a/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
+++ b/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
@@ -17,6 +17,7 @@
package com.android.dialer.phonenumberutil;
import android.content.Context;
+import android.os.Trace;
import android.provider.CallLog;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
@@ -113,6 +114,7 @@
*/
public static String getCurrentCountryIso(
Context context, @Nullable PhoneAccountHandle phoneAccountHandle) {
+ Trace.beginSection("PhoneNumberHelper.getCurrentCountryIso");
// Without framework function calls, this seems to be the most accurate location service
// we can rely on.
String countryIso =
@@ -125,6 +127,7 @@
"No CountryDetector; falling back to countryIso based on locale: " + countryIso);
}
countryIso = countryIso.toUpperCase();
+ Trace.endSection();
return countryIso;
}
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index b3fb97f..aa17dc4 100644
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -118,7 +118,7 @@
// OUTGOING. We may want to do that once we start showing "Voice mail" label on
// the dialpad too.)
if (oldState == InCallState.OUTGOING && mCall != null) {
- if (CallerInfoUtils.isVoiceMailNumber(mContext, mCall) && getActivity() != null) {
+ if (mCall.isVoiceMailNumber() && getActivity() != null) {
getActivity().showDialpadFragment(true /* show */, true /* animate */);
}
}
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index c9fc4a7..871243c 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -478,7 +478,7 @@
!TextUtils.isEmpty(mPrimary.getLastForwardedNumber()),
shouldShowContactPhoto,
mPrimary.getConnectTimeMillis(),
- CallerInfoUtils.isVoiceMailNumber(mContext, mPrimary),
+ mPrimary.isVoiceMailNumber(),
mPrimary.isRemotelyHeld(),
isBusiness,
supports2ndCallOnHold(),
diff --git a/java/com/android/incallui/CallerInfoAsyncQuery.java b/java/com/android/incallui/CallerInfoAsyncQuery.java
index 09752c7..8fc9c4f 100644
--- a/java/com/android/incallui/CallerInfoAsyncQuery.java
+++ b/java/com/android/incallui/CallerInfoAsyncQuery.java
@@ -29,6 +29,7 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.Trace;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Directory;
import android.support.annotation.MainThread;
@@ -191,9 +192,11 @@
CallerInfo info,
OnQueryCompleteListener listener,
Object cookie) {
+ Trace.beginSection("CallerInfoAsyncQuery.startOtherDirectoriesQuery");
long[] directoryIds = StrictModeUtils.bypass(() -> getDirectoryIds(context));
int size = directoryIds.length;
if (size == 0) {
+ Trace.endSection();
return false;
}
@@ -213,6 +216,7 @@
OnQueryCompleteListener intermediateListener = listenerFactory.newListener(directoryId);
startQueryInternal(token, context, info, intermediateListener, cookie, uri);
}
+ Trace.endSection();
return true;
}
diff --git a/java/com/android/incallui/CallerInfoUtils.java b/java/com/android/incallui/CallerInfoUtils.java
index bf586f5..38043ed 100644
--- a/java/com/android/incallui/CallerInfoUtils.java
+++ b/java/com/android/incallui/CallerInfoUtils.java
@@ -16,15 +16,10 @@
package com.android.incallui;
-import android.Manifest.permission;
import android.content.Context;
import android.content.Loader;
import android.content.Loader.OnLoadCompleteListener;
-import android.content.pm.PackageManager;
import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
-import android.telecom.PhoneAccount;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import com.android.contacts.common.model.Contact;
@@ -34,7 +29,6 @@
import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo;
import com.android.dialer.phonenumbercache.ContactInfo;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.util.PermissionsUtil;
import com.android.incallui.call.DialerCall;
import java.util.Arrays;
@@ -112,7 +106,7 @@
// Because the InCallUI is immediately launched before the call is connected, occasionally
// a voicemail call will be passed to InCallUI as a "voicemail:" URI without a number.
// This call should still be handled as a voicemail call.
- if (isVoiceMailNumber(context, call)) {
+ if (call.isVoiceMailNumber()) {
info.markAsVoiceMail(context);
}
@@ -146,20 +140,6 @@
return cacheInfo;
}
- public static boolean isVoiceMailNumber(Context context, @NonNull DialerCall call) {
- if (call.getHandle() != null
- && PhoneAccount.SCHEME_VOICEMAIL.equals(call.getHandle().getScheme())) {
- return true;
- }
-
- if (ContextCompat.checkSelfPermission(context, permission.READ_PHONE_STATE)
- != PackageManager.PERMISSION_GRANTED) {
- return false;
- }
-
- return TelecomUtil.isVoicemailNumber(context, call.getAccountHandle(), call.getNumber());
- }
-
/**
* Handles certain "corner cases" for CNAP. When we receive weird phone numbers from the network
* to indicate different number presentations, convert them to expected number and presentation
diff --git a/java/com/android/incallui/ContactInfoCache.java b/java/com/android/incallui/ContactInfoCache.java
index 2a93945..2fb18b8 100644
--- a/java/com/android/incallui/ContactInfoCache.java
+++ b/java/com/android/incallui/ContactInfoCache.java
@@ -807,10 +807,12 @@
@Override
public void onQueryComplete(int token, Object cookie, CallerInfo callerInfo) {
+ Trace.beginSection("ContactInfoCache.FindInfoCallback.onQueryComplete");
Assert.isMainThread();
DialerCallCookieWrapper cw = (DialerCallCookieWrapper) cookie;
String callId = cw.callId;
if (!isWaitingForThisQuery(cw.callId, mQueryToken.mQueryId)) {
+ Trace.endSection();
return;
}
ContactCacheEntry cacheEntry = mInfoMap.get(callId);
@@ -818,6 +820,7 @@
if (cacheEntry == null) {
Log.w(TAG, "Contact lookup done, but cache entry is not found.");
clearCallbacks(callId);
+ Trace.endSection();
return;
}
// Before issuing a request for more data from other services, we only check that the
@@ -842,6 +845,7 @@
}
clearCallbacks(callId);
}
+ Trace.endSection();
}
}
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 2ba4d98..2e3d721 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -95,6 +95,7 @@
private boolean touchDownWhenPseudoScreenOff;
private boolean isInShowMainInCallFragment;
private boolean needDismissPendingDialogs;
+ private boolean allowOrientationChange;
public InCallActivity() {
common = new InCallActivityCommon(this);
@@ -161,7 +162,9 @@
protected void onStart() {
Trace.beginSection("InCallActivity.onStart");
LogUtil.i("InCallActivity.onStart", "");
+ Trace.beginSection("call super");
super.onStart();
+ Trace.endSection();
isVisible = true;
showMainInCallFragment();
common.onStart();
@@ -514,6 +517,10 @@
}
public void setAllowOrientationChange(boolean allowOrientationChange) {
+ if (this.allowOrientationChange == allowOrientationChange) {
+ return;
+ }
+ this.allowOrientationChange = allowOrientationChange;
if (!allowOrientationChange) {
setRequestedOrientation(InCallOrientationEventListener.ACTIVITY_PREFERENCE_DISALLOW_ROTATION);
} else {
diff --git a/java/com/android/incallui/InCallActivityCommon.java b/java/com/android/incallui/InCallActivityCommon.java
index 9ccda32..0a7c268 100644
--- a/java/com/android/incallui/InCallActivityCommon.java
+++ b/java/com/android/incallui/InCallActivityCommon.java
@@ -29,6 +29,7 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
+import android.os.Trace;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@@ -257,6 +258,7 @@
}
public void onStart() {
+ Trace.beginSection("InCallActivityCommon.onStart");
// setting activity should be last thing in setup process
InCallPresenter.getInstance().setActivity(inCallActivity);
enableInCallOrientationEventListener(
@@ -267,9 +269,11 @@
if (!isRecreating) {
InCallPresenter.getInstance().onUiShowing(true);
}
+ Trace.endSection();
}
public void onResume() {
+ Trace.beginSection("InCallActivityCommon.onResume");
if (InCallPresenter.getInstance().isReadyForTearDown()) {
LogUtil.i(
"InCallActivityCommon.onResume",
@@ -309,6 +313,7 @@
CallList.getInstance()
.onInCallUiShown(
inCallActivity.getIntent().getBooleanExtra(INTENT_EXTRA_FOR_FULL_SCREEN, false));
+ Trace.endSection();
}
// onPause is guaranteed to be called when the InCallActivity goes
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index a0069a6..70fe88b 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -444,6 +444,7 @@
* activity is provided, it means that the activity was finished and we should attempt to cleanup.
*/
private void updateActivity(InCallActivity inCallActivity) {
+ Trace.beginSection("InCallPresenter.updateActivity");
boolean updateListeners = false;
boolean doAttemptCleanup = false;
@@ -475,6 +476,7 @@
if (mInCallState == InCallState.NO_CALLS) {
LogUtil.i("InCallPresenter.updateActivity", "UI Initialized, but no calls left. Shut down");
attemptFinishActivity();
+ Trace.endSection();
return;
}
} else {
@@ -510,6 +512,7 @@
if (doAttemptCleanup) {
attemptCleanup();
}
+ Trace.endSection();
}
public void setManageConferenceActivity(
@@ -842,7 +845,7 @@
if (!mCallList.hasLiveCall()
&& !call.getLogState().isIncoming
&& !isSecretCode(call.getNumber())
- && !CallerInfoUtils.isVoiceMailNumber(mContext, call)) {
+ && !call.isVoiceMailNumber()) {
PostCall.onCallDisconnected(mContext, call.getNumber(), call.getConnectTimeMillis());
}
}
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java
index a08ee0a..8570c58 100644
--- a/java/com/android/incallui/InCallServiceImpl.java
+++ b/java/com/android/incallui/InCallServiceImpl.java
@@ -41,7 +41,9 @@
@Override
public void onCallAudioStateChanged(CallAudioState audioState) {
+ Trace.beginSection("InCallServiceImpl.onCallAudioStateChanged");
AudioModeProvider.getInstance().onAudioStateChanged(audioState);
+ Trace.endSection();
}
@Override
diff --git a/java/com/android/incallui/ProximitySensor.java b/java/com/android/incallui/ProximitySensor.java
index db538ab..339a2e9 100644
--- a/java/com/android/incallui/ProximitySensor.java
+++ b/java/com/android/incallui/ProximitySensor.java
@@ -20,6 +20,7 @@
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.os.PowerManager;
+import android.os.Trace;
import android.support.annotation.NonNull;
import android.telecom.CallAudioState;
import android.view.Display;
@@ -206,6 +207,7 @@
* request for, or is in a video call; or the phone is horizontal while in a call.
*/
private synchronized void updateProximitySensorMode() {
+ Trace.beginSection("ProximitySensor.updateProximitySensorMode");
final int audioRoute = mAudioModeProvider.getAudioState().getRoute();
boolean screenOnImmediately =
@@ -249,6 +251,7 @@
// behavior in either case.
turnOffProximitySensor(screenOnImmediately);
}
+ Trace.endSection();
}
/**
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 7146c72..e5908f1 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -541,6 +541,18 @@
|| !Objects.equals(mRingtone, ringtone)
|| !Objects.equals(savedCallAudioState, callAudioState);
+ LogUtil.d(
+ "StatusBarNotifier.checkForChangeAndSaveData",
+ "data changed: icon: %b, content: %b, state: %b, largeIcon: %b, title: %b, ringtone: %b, "
+ + "audioState: %b, type: %b",
+ (mSavedIcon != icon),
+ !Objects.equals(mSavedContent, content),
+ (mCallState != state),
+ largeIconChanged,
+ contentTitleChanged,
+ !Objects.equals(mRingtone, ringtone),
+ !Objects.equals(savedCallAudioState, callAudioState),
+ mCurrentNotification != notificationType);
// If we aren't showing a notification right now or the notification type is changing,
// definitely do an update.
if (mCurrentNotification != notificationType) {
@@ -614,7 +626,7 @@
@ContactType
int contactType =
LetterTileDrawable.getContactTypeFromPrimitives(
- CallerInfoUtils.isVoiceMailNumber(context, call),
+ call.isVoiceMailNumber(),
call.isSpam(),
contactInfo.isBusiness,
call.getNumberPresentation(),
@@ -709,7 +721,7 @@
resId = getECIncomingCallText(call.getEnrichedCallSession());
} else if (call.hasProperty(Details.PROPERTY_WIFI)) {
resId = R.string.notification_incoming_call_wifi_template;
- } else if (call.getAccountHandle() != null && hasMultiplePhoneAccounts()) {
+ } else if (call.getAccountHandle() != null && hasMultiplePhoneAccounts(call)) {
return getMultiSimIncomingText(call);
} else if (call.isVideoCall()) {
resId = R.string.notification_incoming_video_call;
@@ -1043,9 +1055,11 @@
mStatusBarCallListener = listener;
}
- @SuppressWarnings("MissingPermission")
- private boolean hasMultiplePhoneAccounts() {
- return mContext.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts().size() > 1;
+ private boolean hasMultiplePhoneAccounts(DialerCall call) {
+ if (call.getCallCapableAccounts() == null) {
+ return false;
+ }
+ return call.getCallCapableAccounts().size() > 1;
}
@Override
diff --git a/java/com/android/incallui/answer/impl/AnswerFragment.java b/java/com/android/incallui/answer/impl/AnswerFragment.java
index 3476557..f0b0c0f 100644
--- a/java/com/android/incallui/answer/impl/AnswerFragment.java
+++ b/java/com/android/incallui/answer/impl/AnswerFragment.java
@@ -744,6 +744,7 @@
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
+ Trace.beginSection("AnswerFragment.onViewCreated");
super.onViewCreated(view, savedInstanceState);
createInCallScreenDelegate();
updateUI();
@@ -751,18 +752,22 @@
if (savedInstanceState == null || !savedInstanceState.getBoolean(STATE_HAS_ANIMATED_ENTRY)) {
ViewUtil.doOnGlobalLayout(view, this::animateEntry);
}
+ Trace.endSection();
}
@Override
public void onResume() {
+ Trace.beginSection("AnswerFragment.onResume");
super.onResume();
LogUtil.i("AnswerFragment.onResume", null);
restoreSwipeHintTexts();
inCallScreenDelegate.onInCallScreenResumed();
+ Trace.endSection();
}
@Override
public void onStart() {
+ Trace.beginSection("AnswerFragment.onStart");
super.onStart();
LogUtil.i("AnswerFragment.onStart", null);
@@ -770,10 +775,12 @@
if (answerVideoCallScreen != null) {
answerVideoCallScreen.onVideoScreenStart();
}
+ Trace.endSection();
}
@Override
public void onStop() {
+ Trace.beginSection("AnswerFragment.onStop");
super.onStop();
LogUtil.i("AnswerFragment.onStop", null);
@@ -781,13 +788,16 @@
if (answerVideoCallScreen != null) {
answerVideoCallScreen.onVideoScreenStop();
}
+ Trace.endSection();
}
@Override
public void onPause() {
+ Trace.beginSection("AnswerFragment.onPause");
super.onPause();
LogUtil.i("AnswerFragment.onPause", null);
inCallScreenDelegate.onInCallScreenPaused();
+ Trace.endSection();
}
@Override
diff --git a/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java b/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
index 5c1ee47..ea5956c 100644
--- a/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
+++ b/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
@@ -28,6 +28,7 @@
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.os.Trace;
import android.support.annotation.ColorInt;
import android.support.annotation.FloatRange;
import android.support.annotation.IntDef;
@@ -157,6 +158,7 @@
@Override
public void onStart() {
+ Trace.beginSection("FlingUpDownMethod.onStart");
super.onStart();
falsingManager.onScreenOn();
if (getView() != null) {
@@ -170,22 +172,26 @@
startSwipeToAnswerEntryAnimation();
}
}
+ Trace.endSection();
}
@Override
public void onStop() {
+ Trace.beginSection("FlingUpDownMethod.onStop");
endAnimation();
falsingManager.onScreenOff();
if (getActivity().isFinishing()) {
setAnimationState(AnimationState.COMPLETED);
}
super.onStop();
+ Trace.endSection();
}
@Nullable
@Override
public View onCreateView(
LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
+ Trace.beginSection("FlingUpDownMethod.onCreateView");
View view = layoutInflater.inflate(R.layout.swipe_up_down_method, viewGroup, false);
contactPuckContainer = view.findViewById(R.id.incoming_call_puck_container);
@@ -242,6 +248,7 @@
(ViewGroup) view.findViewById(R.id.hint_container),
contactPuckContainer,
swipeToAnswerText);
+ Trace.endSection();
return view;
}
@@ -400,6 +407,7 @@
}
private void updateSwipeTextAndPuckForTouch() {
+ Trace.beginSection("FlingUpDownMethod.updateSwipeTextAndPuckForTouch");
// Clamp progress value between -1 and 1.
final float clampedProgress = MathUtil.clamp(swipeProgress, -1 /* min */, 1 /* max */);
final float positiveAdjustedProgress = Math.abs(clampedProgress);
@@ -473,6 +481,7 @@
}
getParent().onAnswerProgressUpdate(clampedProgress);
+ Trace.endSection();
}
private void startSwipeToAnswerSwipeAnimation() {
diff --git a/java/com/android/incallui/answer/impl/classifier/FalsingManager.java b/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
index fdcc0a3..9cdd888 100644
--- a/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
+++ b/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
@@ -22,6 +22,7 @@
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.PowerManager;
+import android.os.Trace;
import android.view.MotionEvent;
import android.view.accessibility.AccessibilityManager;
@@ -130,11 +131,17 @@
}
private void registerSensors(int[] sensors) {
+ Trace.beginSection("FalsingManager.registerSensors");
for (int sensorType : sensors) {
+ Trace.beginSection("get sensor " + sensorType);
Sensor s = mSensorManager.getDefaultSensor(sensorType);
+ Trace.endSection();
if (s != null) {
+ Trace.beginSection("register");
mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME);
+ Trace.endSection();
}
}
+ Trace.endSection();
}
}
diff --git a/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java b/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java
index 16fad8b..113144b 100644
--- a/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java
+++ b/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.PowerManager;
+import android.os.Trace;
import android.view.Display;
import com.android.dialer.common.LogUtil;
import com.android.dialer.configprovider.ConfigProviderBindings;
@@ -43,16 +44,19 @@
private final AnswerProximityWakeLock answerProximityWakeLock;
public static boolean shouldUse(Context context, DialerCall call) {
+ Trace.beginSection("AnswerProximitySensor.shouldUse");
// Don't use the AnswerProximitySensor for call waiting and other states. Those states are
// handled by the general ProximitySensor code.
if (call.getState() != State.INCOMING) {
LogUtil.i("AnswerProximitySensor.shouldUse", "call state is not incoming");
+ Trace.endSection();
return false;
}
if (!ConfigProviderBindings.get(context)
.getBoolean(CONFIG_ANSWER_PROXIMITY_SENSOR_ENABLED, true)) {
LogUtil.i("AnswerProximitySensor.shouldUse", "disabled by config");
+ Trace.endSection();
return false;
}
@@ -60,19 +64,23 @@
.getSystemService(PowerManager.class)
.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
LogUtil.i("AnswerProximitySensor.shouldUse", "wake lock level not supported");
+ Trace.endSection();
return false;
}
if (isDefaultDisplayOn(context)) {
LogUtil.i("AnswerProximitySensor.shouldUse", "display is already on");
+ Trace.endSection();
return false;
}
+ Trace.endSection();
return true;
}
public AnswerProximitySensor(
Context context, DialerCall call, PseudoScreenState pseudoScreenState) {
+ Trace.beginSection("AnswerProximitySensor Constructor");
this.call = call;
LogUtil.i("AnswerProximitySensor.constructor", "acquiring lock");
@@ -90,11 +98,14 @@
answerProximityWakeLock.acquire();
call.addListener(this);
+ Trace.endSection();
}
private void cleanup() {
+ Trace.beginSection("AnswerProximitySensor.Cleanup");
call.removeListener(this);
releaseProximityWakeLock();
+ Trace.endSection();
}
private void releaseProximityWakeLock() {
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 8d66206..7c35e4b 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -34,7 +34,6 @@
import com.android.dialer.common.LogUtil;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.enrichedcall.EnrichedCallManager;
-import com.android.dialer.location.GeoUtil;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.shortcuts.ShortcutUsageReporter;
@@ -139,7 +138,7 @@
Spam.get(context)
.checkSpamStatus(
number,
- null,
+ call.getCountryIso(),
new SpamBindings.Listener() {
@Override
public void onComplete(boolean isSpam) {
@@ -196,7 +195,7 @@
}
},
call.getNumber(),
- GeoUtil.getCurrentCountryIso(context));
+ call.getCountryIso());
Trace.endSection();
if (call.getState() == DialerCall.State.INCOMING
@@ -257,7 +256,7 @@
Spam.get(context)
.checkUserMarkedNonSpamStatus(
number,
- null,
+ call.getCountryIso(),
new SpamBindings.Listener() {
@Override
public void onComplete(boolean isInUserWhiteList) {
@@ -268,7 +267,7 @@
Spam.get(context)
.checkGlobalSpamListStatus(
number,
- null,
+ call.getCountryIso(),
new SpamBindings.Listener() {
@Override
public void onComplete(boolean isInGlobalSpamList) {
@@ -279,7 +278,7 @@
Spam.get(context)
.checkUserMarkedSpamStatus(
number,
- null,
+ call.getCountryIso(),
new SpamBindings.Listener() {
@Override
public void onComplete(boolean isInUserSpamList) {
@@ -626,9 +625,11 @@
* listeners to call back to determine what changed.
*/
private void notifyGenericListeners() {
+ Trace.beginSection("CallList.notifyGenericListeners");
for (Listener listener : mListeners) {
listener.onCallListChange(this);
}
+ Trace.endSection();
}
private void notifyListenersOfDisconnect(DialerCall call) {
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 6829203..47a4a70 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -16,6 +16,7 @@
package com.android.incallui.call;
+import android.Manifest.permission;
import android.content.Context;
import android.hardware.camera2.CameraCharacteristics;
import android.net.Uri;
@@ -58,11 +59,14 @@
import com.android.dialer.enrichedcall.EnrichedCallManager.StateChangedListener;
import com.android.dialer.enrichedcall.Session;
import com.android.dialer.lightbringer.LightbringerComponent;
+import com.android.dialer.location.GeoUtil;
import com.android.dialer.logging.ContactLookupResult;
import com.android.dialer.logging.ContactLookupResult.Type;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
+import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.theme.R;
+import com.android.dialer.util.PermissionsUtil;
import com.android.incallui.audiomode.AudioModeProvider;
import com.android.incallui.latencyreport.LatencyReport;
import com.android.incallui.util.TelecomCallUtil;
@@ -158,6 +162,9 @@
private com.android.dialer.logging.VideoTech.Type selectedAvailableVideoTechType =
com.android.dialer.logging.VideoTech.Type.NONE;
+ private boolean isVoicemailNumber;
+ private List<PhoneAccountHandle> callCapableAccounts;
+ private String countryIso;
public static String getNumberFromHandle(Uri handle) {
return handle == null ? "" : handle.getSchemeSpecificPart();
@@ -450,6 +457,30 @@
return mLogState.conferencedCalls != 0;
}
+ public boolean isVoiceMailNumber() {
+ return isVoicemailNumber;
+ }
+
+ public List<PhoneAccountHandle> getCallCapableAccounts() {
+ return callCapableAccounts;
+ }
+
+ public String getCountryIso() {
+ return countryIso;
+ }
+
+ private void updateIsVoiceMailNumber() {
+ if (getHandle() != null && PhoneAccount.SCHEME_VOICEMAIL.equals(getHandle().getScheme())) {
+ isVoicemailNumber = true;
+ }
+
+ if (!PermissionsUtil.hasPermission(mContext, permission.READ_PHONE_STATE)) {
+ isVoicemailNumber = false;
+ }
+
+ isVoicemailNumber = TelecomUtil.isVoicemailNumber(mContext, getAccountHandle(), getNumber());
+ }
+
private void update() {
Trace.beginSection("DialerCall.update");
int oldState = getState();
@@ -475,6 +506,7 @@
Trace.endSection();
}
+ @SuppressWarnings("MissingPermission")
private void updateFromTelecomCall() {
Trace.beginSection("DialerCall.updateFromTelecomCall");
LogUtil.v("DialerCall.updateFromTelecomCall", mTelecomCall.toString());
@@ -510,6 +542,7 @@
updateEmergencyCallState();
}
+ TelecomManager telecomManager = mContext.getSystemService(TelecomManager.class);
// If the phone account handle of the call is set, cache capability bit indicating whether
// the phone account supports call subjects.
PhoneAccountHandle newPhoneAccountHandle = mTelecomCall.getDetails().getAccountHandle();
@@ -517,14 +550,18 @@
mPhoneAccountHandle = newPhoneAccountHandle;
if (mPhoneAccountHandle != null) {
- PhoneAccount phoneAccount =
- mContext.getSystemService(TelecomManager.class).getPhoneAccount(mPhoneAccountHandle);
+ PhoneAccount phoneAccount = telecomManager.getPhoneAccount(mPhoneAccountHandle);
if (phoneAccount != null) {
mIsCallSubjectSupported =
phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT);
}
}
}
+ if (PermissionsUtil.hasPermission(mContext, permission.READ_PHONE_STATE)) {
+ updateIsVoiceMailNumber();
+ callCapableAccounts = telecomManager.getCallCapablePhoneAccounts();
+ countryIso = GeoUtil.getCurrentCountryIso(mContext);
+ }
Trace.endSection();
}
@@ -1148,9 +1185,7 @@
if (callProviderLabel == null) {
PhoneAccount account = getPhoneAccount();
if (account != null && !TextUtils.isEmpty(account.getLabel())) {
- List<PhoneAccountHandle> accounts =
- mContext.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts();
- if (accounts != null && accounts.size() > 1) {
+ if (callCapableAccounts != null && callCapableAccounts.size() > 1) {
callProviderLabel = account.getLabel().toString();
}
}
@@ -1220,9 +1255,11 @@
@Override
public void onSessionModificationStateChanged() {
+ Trace.beginSection("DialerCall.onSessionModificationStateChanged");
for (DialerCallListener listener : mListeners) {
listener.onDialerCallSessionModificationStateChange();
}
+ Trace.endSection();
}
@Override
diff --git a/java/com/android/incallui/spam/SpamCallListListener.java b/java/com/android/incallui/spam/SpamCallListListener.java
index 6b2bdce..cf545c0 100644
--- a/java/com/android/incallui/spam/SpamCallListListener.java
+++ b/java/com/android/incallui/spam/SpamCallListListener.java
@@ -150,7 +150,7 @@
}
NumberInCallHistoryWorker historyTask =
- new NumberInCallHistoryWorker(context, number, GeoUtil.getCurrentCountryIso(context));
+ new NumberInCallHistoryWorker(context, number, call.getCountryIso());
dialerExecutorFactory
.createNonUiTaskBuilder(historyTask)
.onSuccess((result) -> call.setCallHistoryStatus(result))