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

Commit e680a8db authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Make sure PrinterCapabilitiesInfo always have sane values.

Change-Id: I1ae7fe6aabdbe7f9480c4067690338103adaafa2
parent 4723f36d
Loading
Loading
Loading
Loading
+32 −16
Original line number Diff line number Diff line
@@ -24,11 +24,13 @@ import android.print.PrintAttributes.DuplexMode;
import android.print.PrintAttributes.Margins;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Resolution;
import com.android.internal.util.Preconditions;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.IntConsumer;

/**
 * This class represents the capabilities of a printer. Instances
@@ -55,9 +57,9 @@ public final class PrinterCapabilitiesInfo implements Parcelable {

    private static final Margins DEFAULT_MARGINS = new Margins(0,  0,  0,  0);

    private Margins mMinMargins = DEFAULT_MARGINS;
    private List<MediaSize> mMediaSizes;
    private List<Resolution> mResolutions;
    private @NonNull Margins mMinMargins = DEFAULT_MARGINS;
    private @NonNull List<MediaSize> mMediaSizes;
    private @NonNull List<Resolution> mResolutions;

    private int mColorModes;
    private int mDuplexModes;
@@ -205,15 +207,37 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
        return builder.build();
    }

    /**
     * Call enforceSingle for each bit in the mask.
     *
     * @param mask The mask
     * @param enforceSingle The function to call
     */
    private static void enforceValidMask(int mask, IntConsumer enforceSingle) {
        int current = mask;
        while (current > 0) {
            final int currentMode = (1 << Integer.numberOfTrailingZeros(current));
            current &= ~currentMode;
            enforceSingle.accept(currentMode);
        }
    }

    private PrinterCapabilitiesInfo(Parcel parcel) {
        mMinMargins = readMargins(parcel);
        mMinMargins = Preconditions.checkNotNull(readMargins(parcel));
        readMediaSizes(parcel);
        readResolutions(parcel);

        mColorModes = parcel.readInt();
        enforceValidMask(mColorModes,
                (currentMode) -> PrintAttributes.enforceValidColorMode(currentMode));

        mDuplexModes = parcel.readInt();
        enforceValidMask(mDuplexModes,
                (currentMode) -> PrintAttributes.enforceValidColorMode(currentMode));

        readDefaults(parcel);
        Preconditions.checkArgument(mMediaSizes.size() > mDefaults[PROPERTY_MEDIA_SIZE]);
        Preconditions.checkArgument(mResolutions.size() > mDefaults[PROPERTY_RESOLUTION]);
    }

    @Override
@@ -537,12 +561,8 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
         */
        public @NonNull Builder setColorModes(@ColorMode int colorModes,
                @ColorMode int defaultColorMode) {
            int currentModes = colorModes;
            while (currentModes > 0) {
                final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
                currentModes &= ~currentMode;
                PrintAttributes.enforceValidColorMode(currentMode);
            }
            enforceValidMask(colorModes,
                    (currentMode) -> PrintAttributes.enforceValidColorMode(currentMode));
            PrintAttributes.enforceValidColorMode(defaultColorMode);
            mPrototype.mColorModes = colorModes;
            mPrototype.mDefaults[PROPERTY_COLOR_MODE] = defaultColorMode;
@@ -568,12 +588,8 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
         */
        public @NonNull Builder setDuplexModes(@DuplexMode int duplexModes,
                @DuplexMode int defaultDuplexMode) {
            int currentModes = duplexModes;
            while (currentModes > 0) {
                final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
                currentModes &= ~currentMode;
                PrintAttributes.enforceValidDuplexMode(currentMode);
            }
            enforceValidMask(duplexModes,
                    (currentMode) -> PrintAttributes.enforceValidDuplexMode(currentMode));
            PrintAttributes.enforceValidDuplexMode(defaultDuplexMode);
            mPrototype.mDuplexModes = duplexModes;
            mPrototype.mDefaults[PROPERTY_DUPLEX_MODE] = defaultDuplexMode;