19dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/*
29dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Copyright (C) 2016 The Android Open Source Project
39dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
49dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
59dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * you may not use this file except in compliance with the License.
69dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * You may obtain a copy of the License at
79dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
89dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
99dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
109dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software
119dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
129dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * See the License for the specific language governing permissions and
149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * limitations under the License.
159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */
169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannpackage android.printservice.recommendation;
189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.annotation.IntRange;
209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.annotation.NonNull;
219dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.annotation.SystemApi;
229dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.os.Parcel;
239dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.os.Parcelable;
249dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.printservice.PrintService;
257e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport com.android.internal.util.Preconditions;
279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
287e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmannimport java.net.InetAddress;
297e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmannimport java.net.UnknownHostException;
307e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmannimport java.util.ArrayList;
317e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmannimport java.util.List;
327e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
339dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/**
349dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * A recommendation to install a {@link PrintService print service}.
359dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
369dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @hide
379dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */
389dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann@SystemApi
399dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannpublic final class RecommendationInfo implements Parcelable {
409dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** Package name of the print service. */
419dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private @NonNull final CharSequence mPackageName;
429dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
439dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** Display name of the print service. */
449dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private @NonNull final CharSequence mName;
459dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
467e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    /** Printers the print service would discover if installed. */
477e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    @NonNull private final List<InetAddress> mDiscoveredPrinters;
489dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
499dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** If the service detects printer from multiple vendors. */
509dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private final boolean mRecommendsMultiVendorService;
519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
529dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
539dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Create a new recommendation.
549dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
559dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param packageName                  Package name of the print service
569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param name                         Display name of the print service
577e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @param discoveredPrinters           The {@link InetAddress addresses} of the discovered
587e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *                                     printers. Cannot be null or empty.
599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param recommendsMultiVendorService If the service detects printer from multiple vendor
609dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
619dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public RecommendationInfo(@NonNull CharSequence packageName, @NonNull CharSequence name,
627e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann            @NonNull List<InetAddress> discoveredPrinters, boolean recommendsMultiVendorService) {
639dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mPackageName = Preconditions.checkStringNotEmpty(packageName);
649dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mName = Preconditions.checkStringNotEmpty(name);
657e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        mDiscoveredPrinters = Preconditions.checkCollectionElementsNotNull(discoveredPrinters,
667e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann                    "discoveredPrinters");
679dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mRecommendsMultiVendorService = recommendsMultiVendorService;
689dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
699dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
709dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
717e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * Create a new recommendation.
727e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *
737e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @param packageName                  Package name of the print service
747e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @param name                         Display name of the print service
757e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @param numDiscoveredPrinters        Number of printers the print service would discover if
767e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *                                     installed
777e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @param recommendsMultiVendorService If the service detects printer from multiple vendor
787e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *
797e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @deprecated Use {@link RecommendationInfo(String, String, List<InetAddress>, boolean)}
807e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *             instead
817e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     */
827e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    @Deprecated
837e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    public RecommendationInfo(@NonNull CharSequence packageName, @NonNull CharSequence name,
847e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann            @IntRange(from = 0) int numDiscoveredPrinters, boolean recommendsMultiVendorService) {
857e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        throw new IllegalArgumentException("This constructor has been deprecated");
867e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    }
877e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
887e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    /**
897e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * Read a list of blobs from the parcel and return it as a list of {@link InetAddress
907e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * addresses}.
917e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *
927e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @param parcel the parcel to read the blobs from
937e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *
947e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @return The list of {@link InetAddress addresses} or null if no printers were found.
957e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     *
967e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @see #writeToParcel(Parcel, int)
977e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     */
987e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    @NonNull private static ArrayList<InetAddress> readDiscoveredPrinters(@NonNull Parcel parcel) {
997e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        int numDiscoveredPrinters = parcel.readInt();
1007e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        ArrayList<InetAddress> discoveredPrinters = new ArrayList<>(numDiscoveredPrinters);
1017e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1027e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        for (int i = 0; i < numDiscoveredPrinters; i++) {
1037e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann            try {
1047e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann                discoveredPrinters.add(InetAddress.getByAddress(parcel.readBlob()));
1057e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann            } catch (UnknownHostException e) {
1067e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann                throw new IllegalArgumentException(e);
1077e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann            }
1087e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        }
1097e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1107e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        return discoveredPrinters;
1117e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    }
1127e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1137e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    /**
1149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Create a new recommendation from a parcel.
1159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
1169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param parcel The parcel containing the data
1179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
1189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @see #CREATOR
1199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private RecommendationInfo(@NonNull Parcel parcel) {
1217e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        this(parcel.readCharSequence(), parcel.readCharSequence(), readDiscoveredPrinters(parcel),
1229dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                parcel.readByte() != 0);
1239dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1249dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @return The package name the recommendations recommends.
1279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1289dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public CharSequence getPackageName() {
1299dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        return mPackageName;
1309dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1319dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1329dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1339dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @return Whether the recommended print service detects printers of more than one vendor.
1349dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1359dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public boolean recommendsMultiVendorService() {
1369dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        return mRecommendsMultiVendorService;
1379dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1389dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1399dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1407e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     * @return The {@link InetAddress address} of the printers the print service would detect.
1417e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann     */
1427e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    @NonNull public List<InetAddress> getDiscoveredPrinters() {
1437e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        return mDiscoveredPrinters;
1447e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    }
1457e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1467e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann    /**
1479dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @return The number of printer the print service would detect.
1489dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1499dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public int getNumDiscoveredPrinters() {
1507e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        return mDiscoveredPrinters.size();
1519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1529dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1539dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1549dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @return The name of the recommended print service.
1559dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public CharSequence getName() {
1579dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        return mName;
1589dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1609dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
1619dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public int describeContents() {
1629dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        return 0;
1639dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1649dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1659dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
1669dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public void writeToParcel(Parcel dest, int flags) {
1679dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        dest.writeCharSequence(mPackageName);
1689dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        dest.writeCharSequence(mName);
1697e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1707e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        int numDiscoveredPrinters = mDiscoveredPrinters.size();
1717e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        dest.writeInt(numDiscoveredPrinters);
1727e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1737e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        for (InetAddress printer : mDiscoveredPrinters) {
1747e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann            dest.writeBlob(printer.getAddress());
1757e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        }
1767e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
1779dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        dest.writeByte((byte) (mRecommendsMultiVendorService ? 1 : 0));
1789dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1799dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1809dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1819dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Utility class used to create new print service recommendation objects from parcels.
1829dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
1839dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @see #RecommendationInfo(Parcel)
1849dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1859dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public static final Creator<RecommendationInfo> CREATOR =
1869dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            new Creator<RecommendationInfo>() {
1879dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                @Override
1889dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                public RecommendationInfo createFromParcel(Parcel in) {
1899dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                    return new RecommendationInfo(in);
1909dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                }
1919dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1929dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                @Override
1939dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                public RecommendationInfo[] newArray(int size) {
1949dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                    return new RecommendationInfo[size];
1959dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                }
1969dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    };
1979dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann}
198