13bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
23bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 The Android Open Source Project
33bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 Mopria Alliance, Inc.
43bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
53bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
63bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Licensed under the Apache License, Version 2.0 (the "License");
73bf66744d61d18c66d46f2608de0467ad3df0268Mopria * you may not use this file except in compliance with the License.
83bf66744d61d18c66d46f2608de0467ad3df0268Mopria * You may obtain a copy of the License at
93bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
103bf66744d61d18c66d46f2608de0467ad3df0268Mopria *      http://www.apache.org/licenses/LICENSE-2.0
113bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
123bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Unless required by applicable law or agreed to in writing, software
133bf66744d61d18c66d46f2608de0467ad3df0268Mopria * distributed under the License is distributed on an "AS IS" BASIS,
143bf66744d61d18c66d46f2608de0467ad3df0268Mopria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153bf66744d61d18c66d46f2608de0467ad3df0268Mopria * See the License for the specific language governing permissions and
163bf66744d61d18c66d46f2608de0467ad3df0268Mopria * limitations under the License.
173bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
183bf66744d61d18c66d46f2608de0467ad3df0268Mopria
193bf66744d61d18c66d46f2608de0467ad3df0268Mopriapackage com.android.bips.jni;
203bf66744d61d18c66d46f2608de0467ad3df0268Mopria
213bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport android.print.PrintAttributes;
223bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport android.print.PrinterCapabilitiesInfo;
233bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport android.text.TextUtils;
243bf66744d61d18c66d46f2608de0467ad3df0268Mopria
253bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport com.android.bips.BuiltInPrintService;
263bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport com.android.bips.R;
273bf66744d61d18c66d46f2608de0467ad3df0268Mopria
285b703630f15fa72ac43a2f6fbd9fd3ee96b02108Glade Divineyimport java.net.InetAddress;
293bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport java.util.ArrayList;
303bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport java.util.Arrays;
313bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport java.util.HashSet;
323bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport java.util.List;
333bf66744d61d18c66d46f2608de0467ad3df0268Mopriaimport java.util.Objects;
343bf66744d61d18c66d46f2608de0467ad3df0268Mopria
353bf66744d61d18c66d46f2608de0467ad3df0268Mopriapublic class LocalPrinterCapabilities {
363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public String path;
373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public String name;
383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public String uuid;
393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public String location;
403bf66744d61d18c66d46f2608de0467ad3df0268Mopria
413bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public boolean duplex;
423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public boolean borderless;
433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public boolean color;
443bf66744d61d18c66d46f2608de0467ad3df0268Mopria
453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /** Reported MIME types include at least one that the lower layer supports */
463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public boolean isSupported;
473bf66744d61d18c66d46f2608de0467ad3df0268Mopria
483bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public String mediaDefault;
493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public int[] supportedMediaTypes;
503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public int[] supportedMediaSizes;
513bf66744d61d18c66d46f2608de0467ad3df0268Mopria
525b703630f15fa72ac43a2f6fbd9fd3ee96b02108Glade Diviney    public InetAddress inetAddress;
535b703630f15fa72ac43a2f6fbd9fd3ee96b02108Glade Diviney
543bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /** Bears the underlying native C structure (printer_capabilities_t) or null if not present */
553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public byte[] nativeData;
563bf66744d61d18c66d46f2608de0467ad3df0268Mopria
573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public void buildCapabilities(BuiltInPrintService service,
583bf66744d61d18c66d46f2608de0467ad3df0268Mopria            PrinterCapabilitiesInfo.Builder builder) {
593bf66744d61d18c66d46f2608de0467ad3df0268Mopria        builder.setColorModes(
603bf66744d61d18c66d46f2608de0467ad3df0268Mopria                PrintAttributes.COLOR_MODE_MONOCHROME |
613bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        (color ? PrintAttributes.COLOR_MODE_COLOR : 0),
623bf66744d61d18c66d46f2608de0467ad3df0268Mopria                (color ? PrintAttributes.COLOR_MODE_COLOR : PrintAttributes.COLOR_MODE_MONOCHROME));
633bf66744d61d18c66d46f2608de0467ad3df0268Mopria
643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        MediaSizes mediaSizes = MediaSizes.getInstance(service);
653bf66744d61d18c66d46f2608de0467ad3df0268Mopria
663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        String defaultMediaName = mediaDefault;
673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (TextUtils.isEmpty(defaultMediaName) ||
683bf66744d61d18c66d46f2608de0467ad3df0268Mopria                null == mediaSizes.toMediaSize(defaultMediaName)) {
693bf66744d61d18c66d46f2608de0467ad3df0268Mopria            defaultMediaName = MediaSizes.DEFAULT_MEDIA_NAME;
703bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
713bf66744d61d18c66d46f2608de0467ad3df0268Mopria
723bf66744d61d18c66d46f2608de0467ad3df0268Mopria        List<String> mediaNames = new ArrayList<>();
733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int supportedMediaSize : supportedMediaSizes) {
743bf66744d61d18c66d46f2608de0467ad3df0268Mopria            String mediaName = MediaSizes.toMediaName(supportedMediaSize);
753bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (mediaName != null) {
763bf66744d61d18c66d46f2608de0467ad3df0268Mopria                mediaNames.add(mediaName);
773bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
793bf66744d61d18c66d46f2608de0467ad3df0268Mopria
803bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (mediaNames.isEmpty()) {
813bf66744d61d18c66d46f2608de0467ad3df0268Mopria            mediaNames.addAll(MediaSizes.DEFAULT_MEDIA_NAMES);
823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
833bf66744d61d18c66d46f2608de0467ad3df0268Mopria
843bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!mediaNames.contains(defaultMediaName)) {
853bf66744d61d18c66d46f2608de0467ad3df0268Mopria            defaultMediaName = mediaNames.get(0);
863bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
873bf66744d61d18c66d46f2608de0467ad3df0268Mopria
883bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Add media sizes without duplicates
893bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (String mediaName : new HashSet<>(mediaNames)) {
903bf66744d61d18c66d46f2608de0467ad3df0268Mopria            builder.addMediaSize(mediaSizes.toMediaSize(mediaName),
913bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    Objects.equals(mediaName, defaultMediaName));
923bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
933bf66744d61d18c66d46f2608de0467ad3df0268Mopria
943bf66744d61d18c66d46f2608de0467ad3df0268Mopria        builder.addResolution(new PrintAttributes.Resolution(
953bf66744d61d18c66d46f2608de0467ad3df0268Mopria                BackendConstants.RESOLUTION_300_DPI,
963bf66744d61d18c66d46f2608de0467ad3df0268Mopria                service.getString(R.string.resolution_300_dpi), 300, 300), true);
973bf66744d61d18c66d46f2608de0467ad3df0268Mopria
983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (duplex) {
993bf66744d61d18c66d46f2608de0467ad3df0268Mopria            builder.setDuplexModes(
1003bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    PrintAttributes.DUPLEX_MODE_NONE | PrintAttributes.DUPLEX_MODE_LONG_EDGE |
1013bf66744d61d18c66d46f2608de0467ad3df0268Mopria                            PrintAttributes.DUPLEX_MODE_SHORT_EDGE,
1023bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    PrintAttributes.DUPLEX_MODE_NONE);
1033bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1043bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1053bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (borderless) {
1063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            builder.setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0));
1073bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1093bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1103bf66744d61d18c66d46f2608de0467ad3df0268Mopria    @Override
1113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    public String toString() {
1123bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return "LocalPrinterCapabilities{" +
1133bf66744d61d18c66d46f2608de0467ad3df0268Mopria                "path=" + path +
1143bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " name=" + name +
1153bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " uuid=" + uuid +
1163bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " location=" + location +
1173bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " duplex=" + duplex +
1183bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " borderless=" + borderless +
1193bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " color=" + color +
1203bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " isSupported=" + isSupported +
1213bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " mediaDefault=" + mediaDefault +
1223bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " supportedMediaTypes=" + Arrays.toString(supportedMediaTypes) +
1233bf66744d61d18c66d46f2608de0467ad3df0268Mopria                " supportedMediaSizes=" + Arrays.toString(supportedMediaSizes) +
1245b703630f15fa72ac43a2f6fbd9fd3ee96b02108Glade Diviney                " inetAddress=" + inetAddress +
1253bf66744d61d18c66d46f2608de0467ad3df0268Mopria                "}";
1263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1273bf66744d61d18c66d46f2608de0467ad3df0268Mopria}