Catch BadParcelableException

This happens when an old dialer submitted a job and the newer dialer is trying to handle it. The class fingerprint changed so it can no longer be unparceled.

In this CL, such tasks will be dropped.

Bug: 64225192
Test: N/A
PiperOrigin-RevId: 190491751
Change-Id: I90fe2d24a435201cfae09970387e9b1c3a58b094
diff --git a/java/com/android/voicemail/impl/scheduling/TaskQueue.java b/java/com/android/voicemail/impl/scheduling/TaskQueue.java
index fc5aa94..6afcf00 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskQueue.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskQueue.java
@@ -23,6 +23,7 @@
 import com.android.voicemail.impl.Assert;
 import com.android.voicemail.impl.VvmLog;
 import com.android.voicemail.impl.scheduling.Task.TaskId;
+import com.android.voicemail.impl.scheduling.Tasks.TaskCreationException;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -49,9 +50,13 @@
   public void fromBundles(Context context, List<Bundle> pendingTasks) {
     Assert.isTrue(queue.isEmpty());
     for (Bundle pendingTask : pendingTasks) {
-      Task task = Tasks.createTask(context, pendingTask);
-      task.onRestore(pendingTask);
-      add(task);
+      try {
+        Task task = Tasks.createTask(context, pendingTask);
+        task.onRestore(pendingTask);
+        add(task);
+      } catch (TaskCreationException e) {
+        VvmLog.e("TaskQueue.fromBundles", "cannot create task", e);
+      }
     }
   }
 
diff --git a/java/com/android/voicemail/impl/scheduling/TaskReceiver.java b/java/com/android/voicemail/impl/scheduling/TaskReceiver.java
index e78dcf7..b9fd272 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskReceiver.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskReceiver.java
@@ -23,6 +23,7 @@
 import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import com.android.voicemail.impl.VvmLog;
+import com.android.voicemail.impl.scheduling.Tasks.TaskCreationException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -69,8 +70,12 @@
         deferredBroadcasts.add(intent);
         return;
       }
-      Task task = Tasks.createTask(context.getApplicationContext(), intent.getExtras());
-      taskExecutor.addTask(task);
+      try {
+        Task task = Tasks.createTask(context.getApplicationContext(), intent.getExtras());
+        taskExecutor.addTask(task);
+      } catch (TaskCreationException e) {
+        VvmLog.e(TAG, "cannot create task", e);
+      }
     } else {
       VvmLog.i(TAG, "scheduling new job");
       List<Bundle> taskList = new ArrayList<>();
diff --git a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
index 0e3f27c..77a0d25 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
@@ -33,6 +33,7 @@
 import com.android.dialer.strictmode.StrictModeUtils;
 import com.android.voicemail.impl.Assert;
 import com.android.voicemail.impl.VvmLog;
+import com.android.voicemail.impl.scheduling.Tasks.TaskCreationException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -110,7 +111,11 @@
         TaskQueue queue = new TaskQueue();
         queue.fromBundles(context, existingTasks);
         for (Bundle pendingTask : pendingTasks) {
-          queue.add(Tasks.createTask(context, pendingTask));
+          try {
+            queue.add(Tasks.createTask(context, pendingTask));
+          } catch (TaskCreationException e) {
+            VvmLog.e(TAG, "cannot create task", e);
+          }
         }
         pendingTasks = queue.toBundles();
       }
diff --git a/java/com/android/voicemail/impl/scheduling/Tasks.java b/java/com/android/voicemail/impl/scheduling/Tasks.java
index 76da3d7..0333e16 100644
--- a/java/com/android/voicemail/impl/scheduling/Tasks.java
+++ b/java/com/android/voicemail/impl/scheduling/Tasks.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.os.BadParcelableException;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import com.android.voicemail.impl.VvmLog;
@@ -29,16 +30,30 @@
 
   static final String EXTRA_CLASS_NAME = "extra_class_name";
 
+  /** The task cannot be created. */
+  static final class TaskCreationException extends Exception {
+    TaskCreationException(Throwable throwable) {
+      super(throwable);
+    }
+  }
+
   /**
    * Create a task from a bundle. The bundle is created either with {@link #toBundle(Task)} or
    * {@link #createIntent(Context, Class)} from the target {@link Task}
    */
   @NonNull
-  public static Task createTask(Context context, Bundle extras) {
+  public static Task createTask(Context context, Bundle extras) throws TaskCreationException {
     // The extra contains custom parcelables which cannot be unmarshalled by the framework class
     // loader.
     extras.setClassLoader(context.getClassLoader());
-    String className = extras.getString(EXTRA_CLASS_NAME);
+    String className;
+    try {
+      className = extras.getString(EXTRA_CLASS_NAME);
+    } catch (BadParcelableException e) {
+      // BadParcelableException:Parcelable protocol requires that the class implements Parcelable
+      // This happens when the task is submitted before an update, and can no longer be unparceled.
+      throw new TaskCreationException(e);
+    }
     VvmLog.i("Task.createTask", "create task:" + className);
     if (className == null) {
       throw new IllegalArgumentException("EXTRA_CLASS_NAME expected");