Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7cb4d694 authored by Grace Jia's avatar Grace Jia Committed by Michael Bestas
Browse files

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
parent 98033730
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -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 final class SelectPhoneAccountDialogOptionsUtil {

  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 @@ public final class SelectPhoneAccountDialogOptionsUtil {
    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;
  }

+2 −0
Original line number Diff line number Diff line
@@ -49,5 +49,7 @@ message SelectPhoneAccountDialogOptions {
    // 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
+14 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.pm.PackageManager;
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 @@ public abstract class TelecomUtil {
  @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 @@ public abstract class TelecomUtil {
    if (componentName == null) {
      return null;
    }
    if (userHandle == null) {
      return new PhoneAccountHandle(componentName, accountId);
    } else {
      return new PhoneAccountHandle(componentName, accountId, userHandle);
    }
  }

  /**