From 4c03fbdae402b836f2612658b3cede368eeb1dc1 Mon Sep 17 00:00:00 2001 From: wangqi Date: Fri, 14 Jul 2017 14:50:36 -0700 Subject: Fix NPE when user click on call log. This is caused by null tag of videoCallButtonView when expanding action view. Bug: 63710739 Test: none PiperOrigin-RevId: 162011496 Change-Id: If592be8cd9b05c369e2ff8b51610d93af48834f1 --- .../android/dialer/app/calllog/CallLogAdapter.java | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java index 41c9d6003..86590ace6 100644 --- a/java/com/android/dialer/app/calllog/CallLogAdapter.java +++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java @@ -368,20 +368,30 @@ public class CallLogAdapter extends GroupingListAdapter } expandViewHolderActions(viewHolder); - if (viewHolder.videoCallButtonView != null - && viewHolder.videoCallButtonView.getVisibility() == View.VISIBLE - && LightbringerComponent.get(mActivity).getLightbringer().getPackageName() != null - && LightbringerComponent.get(mActivity) - .getLightbringer() - .getPackageName() - .equals( - ((IntentProvider) viewHolder.videoCallButtonView.getTag()) - .getIntent(mActivity) - .getPackage())) { + if (isLightbringerCallButtonVisible(viewHolder.videoCallButtonView)) { CallIntentBuilder.increaseLightbringerCallButtonAppearInExpandedCallLogItemCount(); } } } + + private boolean isLightbringerCallButtonVisible(View videoCallButtonView) { + if (videoCallButtonView == null) { + return false; + } + if (videoCallButtonView.getVisibility() != View.VISIBLE) { + return false; + } + IntentProvider intentProvider = (IntentProvider) videoCallButtonView.getTag(); + if (intentProvider == null) { + return false; + } + String packageName = + LightbringerComponent.get(mActivity).getLightbringer().getPackageName(); + if (packageName == null) { + return false; + } + return packageName.equals(intentProvider.getIntent(mActivity).getPackage()); + } }; private void checkMarkCallLogEntry(CallLogListItemViewHolder viewHolder) { -- cgit v1.2.3 From 01eeb0980b82e1f674973c3ea2721446b9938bf9 Mon Sep 17 00:00:00 2001 From: roldenburg Date: Fri, 14 Jul 2017 17:09:40 -0700 Subject: Dont start a service to cancel missed call notifications, use DialerExecutor instead We cannot start services while in the background on O. Currently, we start a service to cancel missed call notifications in the onStop of our Activity. This is when we are going into the background so it is not safe (as we have seen from the crashes). Bug: 63633461 Test: CallLogNotificationsServiceTest PiperOrigin-RevId: 162029424 Change-Id: Ib0f46aed848ba0898af8cbee1c114b1e41f3ae32 --- .../app/calllog/CallLogNotificationsService.java | 46 +++++++++++++++++----- 1 file changed, 36 insertions(+), 10 deletions(-) (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java index be1ebfb6d..84aedf880 100644 --- a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java +++ b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java @@ -24,7 +24,11 @@ import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; +import android.support.annotation.WorkerThread; +import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.PermissionsUtil; @@ -108,6 +112,15 @@ public class CallLogNotificationsService extends IntentService { context.startService(serviceIntent); } + public static void cancelAllMissedCalls(Context context) { + LogUtil.enterBlock("CallLogNotificationsService.cancelAllMissedCalls"); + DialerExecutorComponent.get(context) + .dialerExecutorFactory() + .createNonUiTaskBuilder(new CancelAllMissedCallsWorker()) + .build() + .executeSerial(context); + } + public static PendingIntent createMarkAllNewVoicemailsAsOldIntent(@NonNull Context context) { Intent intent = new Intent(context, CallLogNotificationsService.class); intent.setAction(CallLogNotificationsService.ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD); @@ -122,13 +135,6 @@ public class CallLogNotificationsService extends IntentService { return PendingIntent.getService(context, 0, intent, 0); } - public static void cancelAllMissedCalls(@NonNull Context context) { - LogUtil.enterBlock("CallLogNotificationsService.cancelAllMissedCalls"); - Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); - serviceIntent.setAction(ACTION_CANCEL_ALL_MISSED_CALLS); - context.startService(serviceIntent); - } - public static PendingIntent createCancelAllMissedCallsPendingIntent(@NonNull Context context) { Intent intent = new Intent(context, CallLogNotificationsService.class); intent.setAction(ACTION_CANCEL_ALL_MISSED_CALLS); @@ -174,9 +180,7 @@ public class CallLogNotificationsService extends IntentService { MissedCallNotifier.getIstance(this).insertPostCallNotification(phoneNumber, note); break; case ACTION_CANCEL_ALL_MISSED_CALLS: - CallLogNotificationsQueryHelper.markAllMissedCallsInCallLogAsRead(this); - MissedCallNotifier.cancelAllMissedCallNotifications(this); - TelecomUtil.cancelMissedCallsNotification(this); + cancelAllMissedCalls(this); break; case ACTION_CANCEL_SINGLE_MISSED_CALL: Uri callUri = intent.getData(); @@ -196,4 +200,26 @@ public class CallLogNotificationsService extends IntentService { break; } } + + @WorkerThread + private static void cancelAllMissedCallsBackground(Context context) { + LogUtil.enterBlock("CallLogNotificationsService.cancelAllMissedCallsBackground"); + Assert.isWorkerThread(); + CallLogNotificationsQueryHelper.markAllMissedCallsInCallLogAsRead(context); + MissedCallNotifier.cancelAllMissedCallNotifications(context); + TelecomUtil.cancelMissedCallsNotification(context); + } + + /** Worker that cancels all missed call notifications and updates call log entries. */ + private static class CancelAllMissedCallsWorker implements Worker { + + @Nullable + @Override + public Void doInBackground(@Nullable Context context) throws Throwable { + if (context != null) { + cancelAllMissedCallsBackground(context); + } + return null; + } + } } -- cgit v1.2.3 From ce761e92df47b50ae3206dd402a46413e8ac3943 Mon Sep 17 00:00:00 2001 From: twyen Date: Mon, 17 Jul 2017 10:30:20 -0700 Subject: Handle null host for secret code The "host" is the number in the "*#*#NUMBER#*#*" format. It was assumed that it could never be null, but silent crash reports proved it wrong. Repro steps are unknown. Bug: 63711549 Test: PawSecretCodeListenerTest PiperOrigin-RevId: 162232903 Change-Id: I15419178099cea7f05c1c9ed5cd595a01ae8db2b --- .../com/android/incallui/answer/impl/hint/PawSecretCodeListener.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'java/com/android') diff --git a/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java b/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java index 204c4e131..871d80c23 100644 --- a/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java +++ b/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java @@ -24,7 +24,6 @@ import android.support.annotation.IntDef; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.widget.Toast; -import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.logging.DialerImpression.Type; @@ -59,7 +58,9 @@ public class PawSecretCodeListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String host = intent.getData().getHost(); - Assert.checkState(!TextUtils.isEmpty(host)); + if (TextUtils.isEmpty(host)) { + return; + } String secretCode = ConfigProviderBindings.get(context).getString(CONFIG_PAW_SECRET_CODE, "729"); if (secretCode == null) { -- cgit v1.2.3 From b950d5f7e9711362f175ff2262d055449b139325 Mon Sep 17 00:00:00 2001 From: roldenburg Date: Mon, 17 Jul 2017 11:49:58 -0700 Subject: Fix Lightbringer call upgrading when Dialer was not in memory before the call We need to load reachability data if we do not already have it when checking for upgrade. Previously we only did this for reachability. Bug: 63757003 Test: LightbringerImplTest PiperOrigin-RevId: 162246049 Change-Id: I9b4919e938b814ea18dc5107967bb6de7a945c19 --- .../com/android/incallui/videotech/lightbringer/LightbringerTech.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'java/com/android') diff --git a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java index 55ee2db21..961de9e9a 100644 --- a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java +++ b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java @@ -91,7 +91,9 @@ public class LightbringerTech implements VideoTech, LightbringerListener { } @Override - public void onRemovedFromCallList() {} + public void onRemovedFromCallList() { + lightbringer.unregisterListener(this); + } @Override public int getSessionModificationState() { -- cgit v1.2.3