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