Fix selecting phone account dialog show error.

AOSP dialer used to ignore UserHandle of a PhoneAccountHandle when
building the selection list. When secondary user or guest mode is in
use, dialer composed a wrong PhoneAccountHandle with current UserHandle
so Telecom cannot provide correct information of this
PhoneAccountHandle.

Bug: 157499347
Test: Manually switch to guest mode or secondary user to check if the
dialog show correctly.

Change-Id: I8a9f9bcf5192f69ca270def48fb850106aa717fb
diff --git a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java
index 5a44ae7..1880d65 100644
--- a/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java
+++ b/java/com/android/contacts/common/widget/SelectPhoneAccountDialogOptionsUtil.java
@@ -16,9 +16,15 @@
 
 package com.android.contacts.common.widget;
 
+import android.os.Parcel;
+import android.os.UserHandle;
+import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import com.android.dialer.common.Assert;
 import com.android.dialer.telecom.TelecomUtil;
+
+import com.google.protobuf.ByteString;
+
 import java.util.Collection;
 
 /** Provides common operation on a {@link SelectPhoneAccountDialogOptions} */
@@ -27,9 +33,21 @@
 
   public static PhoneAccountHandle getPhoneAccountHandle(
       SelectPhoneAccountDialogOptions.Entry entry) {
+    UserHandle userHandle;
+    Parcel parcel = Parcel.obtain();
+    try {
+      byte[] marshalledUserHandle = entry.getUserHandle().toByteArray();
+      parcel.unmarshall(marshalledUserHandle, 0, marshalledUserHandle.length);
+      parcel.setDataPosition(0);
+      userHandle = parcel.readParcelable(UserHandle.class.getClassLoader());
+    } catch (NullPointerException e) {
+      userHandle = null;
+    }
+    parcel.recycle();
     return Assert.isNotNull(
         TelecomUtil.composePhoneAccountHandle(
-            entry.getPhoneAccountHandleComponentName(), entry.getPhoneAccountHandleId()));
+            entry.getPhoneAccountHandleComponentName(), entry.getPhoneAccountHandleId(),
+                userHandle));
   }
 
   public static SelectPhoneAccountDialogOptions.Entry.Builder setPhoneAccountHandle(
@@ -38,6 +56,10 @@
     entryBuilder.setPhoneAccountHandleComponentName(
         phoneAccountHandle.getComponentName().flattenToString());
     entryBuilder.setPhoneAccountHandleId(phoneAccountHandle.getId());
+    Parcel parcel = Parcel.obtain();
+    parcel.writeParcelable(phoneAccountHandle.getUserHandle(), 0);
+    entryBuilder.setUserHandle(ByteString.copyFrom(parcel.marshall()));
+    parcel.recycle();
     return entryBuilder;
   }
 
diff --git a/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto b/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto
index f96e31f..fc443f0 100644
--- a/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto
+++ b/java/com/android/contacts/common/widget/select_phone_account_dialog_options.proto
@@ -49,5 +49,7 @@
     // in a call so the other SIM cannot be used. Hint should also be set to
     // inform the user why the account is unavailable.
     optional bool enabled = 4 [default = true];
+
+    optional bytes user_handle = 5;
   }
 }
\ No newline at end of file
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index c088146..633a53e 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -25,6 +25,7 @@
 import android.net.Uri;
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
+import android.os.UserHandle;
 import android.provider.CallLog.Calls;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -169,6 +170,14 @@
   @Nullable
   public static PhoneAccountHandle composePhoneAccountHandle(
       @Nullable String componentString, @Nullable String accountId) {
+    return composePhoneAccountHandle(componentString, accountId, null);
+  }
+
+  /** Compose {@link PhoneAccountHandle} object from component name, account id and user handle. */
+  @Nullable
+  public static PhoneAccountHandle composePhoneAccountHandle(
+          @Nullable String componentString, @Nullable String accountId,
+          @Nullable UserHandle userHandle) {
     if (TextUtils.isEmpty(componentString) || TextUtils.isEmpty(accountId)) {
       return null;
     }
@@ -176,7 +185,11 @@
     if (componentName == null) {
       return null;
     }
-    return new PhoneAccountHandle(componentName, accountId);
+    if (userHandle == null) {
+      return new PhoneAccountHandle(componentName, accountId);
+    } else {
+      return new PhoneAccountHandle(componentName, accountId, userHandle);
+    }
   }
 
   /**