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

Commit 6afa68e4 authored by sandeepjs's avatar sandeepjs Committed by Sandeep Jawalkar
Browse files

[MEP] eSIM API refactor to support MEP

Newly added UiccPortInfo and UiccSlotMapping classes and introduced
UiccPortInfo as a port list in UiccCardInfo and UiccSlotInfo,
Deprecated some constructors and updated callers.
Test: build
Bug: 159354974
Change-Id: I71e4e1ef649b7301d126dde23d53783761de940f
Merged-In: I71e4e1ef649b7301d126dde23d53783761de940f
parent 8bc5344f
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -42580,6 +42580,7 @@ package android.telephony {
    method @Deprecated public int getMnc();
    method @Nullable public String getMncString();
    method public String getNumber();
    method public int getPortIndex();
    method public int getSimSlotIndex();
    method public int getSubscriptionId();
    method public int getSubscriptionType();
@@ -43126,14 +43127,28 @@ package android.telephony {
    method public int describeContents();
    method public int getCardId();
    method @Nullable public String getEid();
    method @Nullable public String getIccId();
    method public int getSlotIndex();
    method @Deprecated @Nullable public String getIccId();
    method public int getPhysicalSlotIndex();
    method @NonNull public java.util.Collection<android.telephony.UiccPortInfo> getPorts();
    method @Deprecated public int getSlotIndex();
    method public boolean isEuicc();
    method public boolean isMultipleEnabledProfilesSupported();
    method public boolean isRemovable();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccCardInfo> CREATOR;
  }
  public final class UiccPortInfo implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public String getIccId();
    method @IntRange(from=0) public int getLogicalSlotIndex();
    method @IntRange(from=0) public int getPortIndex();
    method public boolean isActive();
    method public void writeToParcel(@Nullable android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccPortInfo> CREATOR;
    field public static final String ICCID_REDACTED = "FFFFFFFFFFFFFFFFFFFF";
  }
  public abstract class VisualVoicemailService extends android.app.Service {
    ctor public VisualVoicemailService();
    method public android.os.IBinder onBind(android.content.Intent);
@@ -43434,6 +43449,7 @@ package android.telephony.euicc {
    method @Nullable public String getEid();
    method @Nullable public android.telephony.euicc.EuiccInfo getEuiccInfo();
    method public boolean isEnabled();
    method public boolean isSimPortAvailable(int);
    method public void startResolutionActivity(android.app.Activity, int, android.content.Intent, android.app.PendingIntent) throws android.content.IntentSender.SendIntentException;
    method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, android.app.PendingIntent);
    method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void updateSubscriptionNickname(int, @Nullable String, @NonNull android.app.PendingIntent);
+18 −5
Original line number Diff line number Diff line
@@ -12140,6 +12140,7 @@ package android.telephony {
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimSlotMapping(@NonNull java.util.Collection<android.telephony.UiccSlotMapping>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>);
    method @Deprecated public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean);
@@ -12151,7 +12152,7 @@ package android.telephony {
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPinReportResult(String);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean supplyPuk(String, String);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff();
    method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor);
    method public void updateServiceLocation();
@@ -12325,10 +12326,11 @@ package android.telephony {
    method public int describeContents();
    method public String getCardId();
    method public int getCardStateInfo();
    method public boolean getIsActive();
    method @Deprecated public boolean getIsActive();
    method public boolean getIsEuicc();
    method public boolean getIsExtendedApduSupported();
    method public int getLogicalSlotIdx();
    method @Deprecated public int getLogicalSlotIdx();
    method @NonNull public java.util.Collection<android.telephony.UiccPortInfo> getPorts();
    method public boolean isRemovable();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CARD_STATE_INFO_ABSENT = 1; // 0x1
@@ -12338,6 +12340,15 @@ package android.telephony {
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccSlotInfo> CREATOR;
  }
  public final class UiccSlotMapping implements android.os.Parcelable {
    method public int describeContents();
    method @IntRange(from=0) public int getLogicalSlotIndex();
    method @IntRange(from=0) public int getPhysicalSlotIndex();
    method @IntRange(from=0) public int getPortIndex();
    method public void writeToParcel(@Nullable android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.UiccSlotMapping> CREATOR;
  }
  public abstract class VisualVoicemailService extends android.app.Service {
    method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, String, short, String, android.app.PendingIntent);
    method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings);
@@ -12629,7 +12640,8 @@ package android.telephony.euicc {
    method public void authenticateServer(String, String, byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
    method public void cancelSession(String, byte[], @android.telephony.euicc.EuiccCardManager.CancelReason int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
    method public void deleteProfile(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
    method public void disableProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
    method @Deprecated public void disableProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
    method public void disableProfile(@Nullable String, @Nullable String, int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
    method public void listNotifications(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
    method public void loadBoundProfilePackage(String, byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
    method public void prepareDownload(String, @Nullable byte[], byte[], byte[], byte[], java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<byte[]>);
@@ -12647,7 +12659,8 @@ package android.telephony.euicc {
    method public void retrieveNotificationList(String, @android.telephony.euicc.EuiccNotification.Event int, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.telephony.euicc.EuiccNotification[]>);
    method public void setDefaultSmdpAddress(String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
    method public void setNickname(String, String, String, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<java.lang.Void>);
    method public void switchToProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
    method @Deprecated public void switchToProfile(String, String, boolean, java.util.concurrent.Executor, android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
    method public void switchToProfile(@Nullable String, @Nullable String, int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.euicc.EuiccCardManager.ResultCallback<android.service.euicc.EuiccProfileInfo>);
    field public static final int CANCEL_REASON_END_USER_REJECTED = 0; // 0x0
    field public static final int CANCEL_REASON_POSTPONED = 1; // 0x1
    field public static final int CANCEL_REASON_PPR_NOT_ALLOWED = 3; // 0x3
+36 −3
Original line number Diff line number Diff line
@@ -221,6 +221,11 @@ public class SubscriptionInfo implements Parcelable {
     */
    private boolean mAreUiccApplicationsEnabled = true;

    /**
     * The port index of the Uicc card.
     */
    private final int mPortIndex;

    /**
     * Public copy constructor.
     * @hide
@@ -274,6 +279,22 @@ public class SubscriptionInfo implements Parcelable {
            int carrierId, int profileClass, int subType, @Nullable String groupOwner,
            @Nullable UiccAccessRule[] carrierConfigAccessRules,
            boolean areUiccApplicationsEnabled) {
        this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
                roaming, icon, mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString,
                cardId, isOpportunistic, groupUUID, isGroupDisabled, carrierId, profileClass,
                subType, groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, 0);
    }
    /**
     * @hide
     */
    public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
            CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
            Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
            @Nullable UiccAccessRule[] nativeAccessRules, String cardString, int cardId,
            boolean isOpportunistic, @Nullable String groupUUID, boolean isGroupDisabled,
            int carrierId, int profileClass, int subType, @Nullable String groupOwner,
            @Nullable UiccAccessRule[] carrierConfigAccessRules,
            boolean areUiccApplicationsEnabled, int portIndex) {
        this.mId = id;
        this.mIccId = iccId;
        this.mSimSlotIndex = simSlotIndex;
@@ -300,8 +321,8 @@ public class SubscriptionInfo implements Parcelable {
        this.mGroupOwner = groupOwner;
        this.mCarrierConfigAccessRules = carrierConfigAccessRules;
        this.mAreUiccApplicationsEnabled = areUiccApplicationsEnabled;
        this.mPortIndex = portIndex;
    }

    /**
     * @return the subscription ID.
     */
@@ -737,6 +758,14 @@ public class SubscriptionInfo implements Parcelable {
    public int getCardId() {
        return this.mCardId;
    }
    /**
     * Returns the port index of the SIM card which contains the subscription.
     *
     * @return the portIndex
     */
    public int getPortIndex() {
        return this.mPortIndex;
    }

    /**
     * Set whether the subscription's group is disabled.
@@ -783,6 +812,7 @@ public class SubscriptionInfo implements Parcelable {
            UiccAccessRule[] nativeAccessRules = source.createTypedArray(UiccAccessRule.CREATOR);
            String cardString = source.readString();
            int cardId = source.readInt();
            int portId = source.readInt();
            boolean isOpportunistic = source.readBoolean();
            String groupUUID = source.readString();
            boolean isGroupDisabled = source.readBoolean();
@@ -800,7 +830,7 @@ public class SubscriptionInfo implements Parcelable {
                    carrierName, nameSource, iconTint, number, dataRoaming, /* icon= */ null,
                    mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, cardId,
                    isOpportunistic, groupUUID, isGroupDisabled, carrierid, profileClass, subType,
                    groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled);
                    groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, portId);
            info.setAssociatedPlmns(ehplmns, hplmns);
            return info;
        }
@@ -830,6 +860,7 @@ public class SubscriptionInfo implements Parcelable {
        dest.writeTypedArray(mNativeAccessRules, flags);
        dest.writeString(mCardString);
        dest.writeInt(mCardId);
        dest.writeInt(mPortIndex);
        dest.writeBoolean(mIsOpportunistic);
        dest.writeString(mGroupUUID == null ? null : mGroupUUID.toString());
        dest.writeBoolean(mIsGroupDisabled);
@@ -876,6 +907,7 @@ public class SubscriptionInfo implements Parcelable {
                + " mnc=" + mMnc + " countryIso=" + mCountryIso + " isEmbedded=" + mIsEmbedded
                + " nativeAccessRules=" + Arrays.toString(mNativeAccessRules)
                + " cardString=" + cardStringToPrint + " cardId=" + mCardId
                + " portIndex=" + mPortIndex
                + " isOpportunistic=" + mIsOpportunistic + " groupUUID=" + mGroupUUID
                + " isGroupDisabled=" + mIsGroupDisabled
                + " profileClass=" + mProfileClass
@@ -892,7 +924,7 @@ public class SubscriptionInfo implements Parcelable {
        return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded,
                mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString,
                mCardId, mDisplayName, mCarrierName, mNativeAccessRules, mIsGroupDisabled,
                mCarrierId, mProfileClass, mGroupOwner, mAreUiccApplicationsEnabled);
                mCarrierId, mProfileClass, mGroupOwner, mAreUiccApplicationsEnabled, mPortIndex);
    }

    @Override
@@ -925,6 +957,7 @@ public class SubscriptionInfo implements Parcelable {
                && Objects.equals(mCountryIso, toCompare.mCountryIso)
                && Objects.equals(mCardString, toCompare.mCardString)
                && Objects.equals(mCardId, toCompare.mCardId)
                && mPortIndex == toCompare.mPortIndex
                && Objects.equals(mGroupOwner, toCompare.mGroupOwner)
                && TextUtils.equals(mDisplayName, toCompare.mDisplayName)
                && TextUtils.equals(mCarrierName, toCompare.mCarrierName)
+115 −4
Original line number Diff line number Diff line
@@ -132,6 +132,8 @@ import java.lang.annotation.RetentionPolicy;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -145,6 +147,7 @@ import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
 * Provides access to information about the telephony services on
 * the device. Applications can use the methods in this class to
@@ -3941,8 +3944,8 @@ public class TelephonyManager {
     * <p>
     * If the caller has carrier priviliges on any active subscription, then they have permission to
     * get simple information like the card ID ({@link UiccCardInfo#getCardId()}), whether the card
     * is an eUICC ({@link UiccCardInfo#isEuicc()}), and the slot index where the card is inserted
     * ({@link UiccCardInfo#getSlotIndex()}).
     * is an eUICC ({@link UiccCardInfo#isEuicc()}), and the physical slot index where the card is
     * inserted ({@link UiccCardInfo#getPhysicalSlotIndex()}.
     * <p>
     * To get private information such as the EID ({@link UiccCardInfo#getEid()}) or ICCID
     * ({@link UiccCardInfo#getIccId()}), the caller must have carrier priviliges on that specific
@@ -3986,7 +3989,7 @@ public class TelephonyManager {
            if (telephony == null) {
                return null;
            }
            return telephony.getUiccSlotsInfo();
            return telephony.getUiccSlotsInfo(mContext.getOpPackageName());
        } catch (RemoteException e) {
            return null;
        }
@@ -4019,8 +4022,13 @@ public class TelephonyManager {
     *        size should be same as {@link #getUiccSlotsInfo()}.
     * @return boolean Return true if the switch succeeds, false if the switch fails.
     * @hide
     * @deprecated {@link #setSimSlotMapping(Collection, Executor, Consumer)}
     */
     // TODO: once integrating the HAL changes we can  convert int[] to List<UiccSlotMapping> and
     // converge API's in ITelephony.aidl and PhoneInterfaceManager
    @SystemApi
    @Deprecated
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    public boolean switchSlots(int[] physicalSlots) {
        try {
@@ -4034,6 +4042,109 @@ public class TelephonyManager {
        }
    }
    /**
     * @param slotMapping Logical to physical slot and port mapping.
     * @return {@code true} if slotMapping is valid.
     * @return {@code false} if slotMapping is invalid.
     *
     * slotMapping is invalid if there are different entries (physical slot + port) mapping to the
     * same logical slot or if there are same {physical slot + port} mapping to the different
     * logical slot
     * @hide
     */
    private static boolean isSlotMappingValid(@NonNull Collection<UiccSlotMapping> slotMapping) {
        // Grouping the collection by logicalSlotIndex, finding different entries mapping to the
        // same logical slot
        Map<Integer, List<UiccSlotMapping>> slotMappingInfo = slotMapping.stream().collect(
                Collectors.groupingBy(UiccSlotMapping::getLogicalSlotIndex));
        for (Map.Entry<Integer, List<UiccSlotMapping>> entry : slotMappingInfo.entrySet()) {
            List<UiccSlotMapping> logicalSlotMap = entry.getValue();
            if (logicalSlotMap.size() > 1) {
                // duplicate logicalSlotIndex found
                return false;
            }
        }
        // Grouping the collection by physical slot and port, finding same entries mapping to the
        // different logical slot
        Map<List<Integer>, List<UiccSlotMapping>> slotMapInfos = slotMapping.stream().collect(
                Collectors.groupingBy(
                        slot -> Arrays.asList(slot.getPhysicalSlotIndex(), slot.getPortIndex())));
        for (Map.Entry<List<Integer>, List<UiccSlotMapping>> entry : slotMapInfos.entrySet()) {
            List<UiccSlotMapping> portAndPhysicalSlotList = entry.getValue();
            if (portAndPhysicalSlotList.size() > 1) {
                // duplicate pair of portIndex and physicalSlotIndex found
                return false;
            }
        }
        return true;
    }
    /**
     * Maps the logical slots to physical slots and ports. Mapping is specified from
     * {@link UiccSlotMapping} which consist of both physical slot index and port index.
     * Logical slot is the slot that is seen by modem. Physical slot is the actual physical slot.
     * Port index is the index (enumerated value) for the associated port available on the SIM.
     * Each physical slot can have multiple ports if multi-enabled profile(MEP) is supported.
     *
     * Example: no. of logical slots 1 and physical slots 2 do not support MEP, each physical slot
     * has one port:
     * The only logical slot (index 0) can be mapped to first physical slot (value 0), port(index
     * 0) or
     * second physical slot(value 1), port (index 0), while the other physical slot remains unmapped
     * and inactive.
     * slotMapping[0] = UiccSlotMapping{0 //logical slot, 0 //physical slot//, 0 //port//}
     * slotMapping[0] = UiccSlotMapping{1 // logical slot, 1 //physical slot//, 0 //port//}
     *
     * Example no. of logical slots 2 and physical slots 2 supports MEP with 2 ports available:
     * Each logical slot must be mapped to a port (physical slot and port combination).
     * First logical slot (index 0) can be mapped to physical slot 1 and the second logical slot
     * can be mapped to either port from physical slot 2.
     *
     * slotMapping[0] = UiccSlotMapping{0, 0, 0} and slotMapping[1] = UiccSlotMapping{1, 0, 0} or
     * slotMapping[0] = UiccSlotMapping{0, 0, 0} and slotMapping[1] = UiccSlotMapping{1, 1, 1}
     *
     * or the other way around, the second logical slot(index 1) can be mapped to physical slot 1
     * and the first logical slot can be mapped to either port from physical slot 2.
     *
     * slotMapping[1] = UiccSlotMapping{0, 0, 0} and slotMapping[0] = UiccSlotMapping{1, 0, 0} or
     * slotMapping[1] = UiccSlotMapping{0, 0, 0} and slotMapping[0] = UiccSlotMapping{1, 1, 1}
     *
     * another possible mapping is each logical slot maps to each port of physical slot 2 and there
     * is no active logical modem mapped to physical slot 1.
     *
     * slotMapping[0] = UiccSlotMapping{1, 0, 0} and slotMapping[1] = UiccSlotMapping{1, 1, 1} or
     * slotMapping[0] = UiccSlotMapping{1, 1, 1} and slotMapping[1] = UiccSlotMapping{1, 0, 0}
     *
     * @param slotMapping Logical to physical slot and port mapping.
     * @throws IllegalStateException if telephony service is null or slot mapping was sent when the
     *         radio in middle of a silent restart or other invalid states to handle the command
     * @throws IllegalArgumentException if the caller passes in an invalid collection of
     *         UiccSlotMapping like duplicate data, etc
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    public void setSimSlotMapping(@NonNull Collection<UiccSlotMapping> slotMapping) {
        try {
            ITelephony telephony = getITelephony();
            if (telephony != null) {
                if (isSlotMappingValid(slotMapping)) {
                    boolean result = telephony.setSimSlotMapping(new ArrayList(slotMapping));
                    if (!result) {
                        throw new IllegalStateException("setSimSlotMapping has failed");
                    }
                } else {
                    throw new IllegalArgumentException("Duplicate UiccSlotMapping data found");
                }
            } else {
                throw new IllegalStateException("telephony service is null.");
            }
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }
    /**
     * Get the mapping from logical slots to physical slots. The key of the map is the logical slot
     * id and the value is the physical slots id mapped to this logical slot id.
@@ -4051,7 +4162,7 @@ public class TelephonyManager {
        try {
            ITelephony telephony = getITelephony();
            if (telephony != null) {
                int[] slotMappingArray = telephony.getSlotsMapping();
                int[] slotMappingArray = telephony.getSlotsMapping(mContext.getOpPackageName());
                for (int i = 0; i < slotMappingArray.length; i++) {
                    slotMapping.put(i, slotMappingArray[i]);
                }
+112 −33

File changed.

Preview size limit exceeded, changes collapsed.

Loading