Merge changes I9b4919e9,I15419178,Ib0f46aed,If592be8c

* changes:
  Fix Lightbringer call upgrading when Dialer was not in memory before the call
  Handle null host for secret code
  Dont start a service to cancel missed call notifications, use DialerExecutor instead
  Fix NPE when user click on call log.
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index e3509a9..0e8112c 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -368,20 +368,30 @@
             }
             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) {
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
index be1ebfb..84aedf8 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.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 @@
     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 @@
     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 @@
         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 @@
         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<Context, Void> {
+
+    @Nullable
+    @Override
+    public Void doInBackground(@Nullable Context context) throws Throwable {
+      if (context != null) {
+        cancelAllMissedCallsBackground(context);
+      }
+      return null;
+    }
+  }
 }
diff --git a/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java b/java/com/android/incallui/answer/impl/hint/PawSecretCodeListener.java
index 204c4e1..871d80c 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.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 @@
   @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) {
diff --git a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
index 55ee2db..961de9e 100644
--- a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
+++ b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
@@ -91,7 +91,9 @@
   }
 
   @Override
-  public void onRemovedFromCallList() {}
+  public void onRemovedFromCallList() {
+    lightbringer.unregisterListener(this);
+  }
 
   @Override
   public int getSessionModificationState() {