1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * Copyright (C) 2016 Mopria Alliance, Inc. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package com.android.bips.jni; 19 20 import android.annotation.SuppressLint; 21 import android.content.Context; 22 import android.print.PrintAttributes; 23 24 import com.android.bips.R; 25 26 import java.util.ArrayList; 27 import java.util.Collection; 28 import java.util.HashMap; 29 import java.util.Map; 30 31 /** Supported media sizes */ 32 public class MediaSizes { 33 private static final String ISO_A4 = "iso_a4_210x297mm"; 34 private static final String LETTER = "na_letter_8.5x11in"; 35 private static final String LEGAL = "na_legal_8.5x14in"; 36 private static final String PHOTO_4x6in = "na_index-4x6_4x6in"; 37 private static final String PHOTO_5x7 = "na_5x7_5x7in"; 38 private static final String NA_LEDGER_11X17 = "na_ledger_11x17in"; 39 private static final String ISO_A3 = "iso_a3_297x420mm"; 40 private static final String ISO_A5 = "iso_a5_148x210mm"; 41 private static final String JPN_HAGAKI = "jpn_hagaki_100x148mm"; 42 private static final String OM_DSC_PHOTO = "om_dsc-photo_89x119mm"; 43 private static final String OM_CARD = "om_card_54x86mm"; 44 private static final String JIS_B4 = "jis_b4_257x364mm"; 45 private static final String JIS_B5 = "jis_b5_182x257mm"; 46 public static final String OE_PHOTO_L = "oe_photo-l_3.5x5in"; 47 private static final String NA_GOVT_LETTER = "na_govt-letter_8x10in"; 48 private static final String ISO_A0 = "iso_a0_841x1189mm"; 49 private static final String ISO_A1 = "iso_a1_594x841mm"; 50 private static final String ISO_A2 = "iso_a2_420x594mm"; 51 private static final String ARCH_A = "na_arch-a_9x12in"; 52 private static final String ARCH_B = "na_arch-b_12x18in"; 53 private static final String ARCH_C = "na_arch-c_18x24in"; 54 private static final String ARCH_D = "na_arch-d_24x36in"; 55 private static final String ARCH_E = "na_arch-e_36x48in"; 56 private static final String ARCH_E1 = "na_wide-format_30x42in"; 57 private static final String ANSI_C = "na_c_17x22in"; 58 private static final String ANSI_D = "na_d_22x34in"; 59 private static final String ANSI_E = "na_e_34x44in"; 60 private static final String ANSI_F = "asme_f_28x40in"; 61 private static final String SUPER_B = "na_super-b_13x19in"; 62 63 /** The backend string name for the default media size */ 64 static final String DEFAULT_MEDIA_NAME = ISO_A4; 65 66 @SuppressLint("UseSparseArrays") 67 private static final Map<Integer, String> sCodeToStringMap = new HashMap<>(); 68 69 /** The default string names for default media sizes */ 70 static final Collection<String> DEFAULT_MEDIA_NAMES = new ArrayList<>(); 71 private static MediaSizes sInstance; 72 73 static { 74 DEFAULT_MEDIA_NAMES.add(ISO_A4); 75 DEFAULT_MEDIA_NAMES.add(LETTER); 76 DEFAULT_MEDIA_NAMES.add(PHOTO_4x6in); 77 DEFAULT_MEDIA_NAMES.add(PHOTO_5x7); 78 } 79 80 static { 81 sCodeToStringMap.put(2, LETTER); 82 sCodeToStringMap.put(3, LEGAL); 83 sCodeToStringMap.put(7, NA_GOVT_LETTER); 84 sCodeToStringMap.put(11, NA_LEDGER_11X17); 85 sCodeToStringMap.put(12, ANSI_C); 86 sCodeToStringMap.put(13, ANSI_D); 87 sCodeToStringMap.put(14, ANSI_E); 88 sCodeToStringMap.put(16, SUPER_B); 89 sCodeToStringMap.put(25, ISO_A5); 90 sCodeToStringMap.put(26, ISO_A4); 91 sCodeToStringMap.put(27, ISO_A3); 92 sCodeToStringMap.put(28, ISO_A2); 93 sCodeToStringMap.put(29, ISO_A1); 94 sCodeToStringMap.put(30, ISO_A0); 95 sCodeToStringMap.put(45, JIS_B5); 96 sCodeToStringMap.put(46, JIS_B4); 97 sCodeToStringMap.put(71, JPN_HAGAKI); 98 sCodeToStringMap.put(74, PHOTO_4x6in); 99 sCodeToStringMap.put(122, PHOTO_5x7); 100 sCodeToStringMap.put(176, ARCH_A); 101 sCodeToStringMap.put(177, ARCH_B); 102 sCodeToStringMap.put(178, ARCH_C); 103 sCodeToStringMap.put(179, ARCH_D); 104 sCodeToStringMap.put(180, ARCH_E); 105 sCodeToStringMap.put(181, ARCH_E1); 106 sCodeToStringMap.put(182, ANSI_F); 107 sCodeToStringMap.put(302, OM_DSC_PHOTO); 108 sCodeToStringMap.put(303, OM_CARD); 109 sCodeToStringMap.put(304, OE_PHOTO_L); 110 } 111 112 private final Map<String, PrintAttributes.MediaSize> mNameToSizeMap = new HashMap<>(); 113 MediaSizes(Context context)114 private MediaSizes(Context context) { 115 mNameToSizeMap.put(LETTER, PrintAttributes.MediaSize.NA_LETTER); 116 mNameToSizeMap.put(LEGAL, PrintAttributes.MediaSize.NA_LEGAL); 117 mNameToSizeMap.put(ISO_A3, PrintAttributes.MediaSize.ISO_A3); 118 mNameToSizeMap.put(ISO_A4, PrintAttributes.MediaSize.ISO_A4); 119 mNameToSizeMap.put(ISO_A5, PrintAttributes.MediaSize.ISO_A5); 120 mNameToSizeMap.put(JPN_HAGAKI, PrintAttributes.MediaSize.JPN_HAGAKI); 121 mNameToSizeMap.put(JIS_B4, PrintAttributes.MediaSize.JIS_B4); 122 mNameToSizeMap.put(JIS_B5, PrintAttributes.MediaSize.JIS_B5); 123 mNameToSizeMap.put(NA_LEDGER_11X17, PrintAttributes.MediaSize.NA_TABLOID); 124 mNameToSizeMap.put(ISO_A0, PrintAttributes.MediaSize.ISO_A0); 125 mNameToSizeMap.put(ISO_A1, PrintAttributes.MediaSize.ISO_A1); 126 mNameToSizeMap.put(ISO_A2, PrintAttributes.MediaSize.ISO_A2); 127 mNameToSizeMap.put(ANSI_C, PrintAttributes.MediaSize.ANSI_C); 128 mNameToSizeMap.put(ANSI_D, PrintAttributes.MediaSize.ANSI_D); 129 mNameToSizeMap.put(ANSI_E, PrintAttributes.MediaSize.ANSI_E); 130 mNameToSizeMap.put(ANSI_F, PrintAttributes.MediaSize.ANSI_F); 131 mNameToSizeMap.put(ARCH_A, PrintAttributes.MediaSize.NA_ARCH_A); 132 mNameToSizeMap.put(ARCH_B, PrintAttributes.MediaSize.NA_ARCH_B); 133 mNameToSizeMap.put(ARCH_C, PrintAttributes.MediaSize.NA_ARCH_C); 134 mNameToSizeMap.put(ARCH_D, PrintAttributes.MediaSize.NA_ARCH_D); 135 mNameToSizeMap.put(ARCH_E, PrintAttributes.MediaSize.NA_ARCH_E); 136 mNameToSizeMap.put(ARCH_E1, PrintAttributes.MediaSize.NA_ARCH_E1); 137 mNameToSizeMap.put(SUPER_B, PrintAttributes.MediaSize.NA_SUPER_B); 138 139 // Custom media sizes 140 mNameToSizeMap.put(PHOTO_4x6in, new PrintAttributes.MediaSize( 141 PHOTO_4x6in, 142 context.getString(R.string.media_size_4x6in), 4000, 6000)); 143 mNameToSizeMap.put(NA_GOVT_LETTER, new PrintAttributes.MediaSize( 144 NA_GOVT_LETTER, 145 context.getString(R.string.media_size_8x10in), 8000, 10000)); 146 mNameToSizeMap.put(PHOTO_5x7, new PrintAttributes.MediaSize( 147 PHOTO_5x7, 148 context.getString(R.string.media_size_5x7in), 5000, 7000)); 149 mNameToSizeMap.put(OM_DSC_PHOTO, new PrintAttributes.MediaSize( 150 OM_DSC_PHOTO, 151 context.getString(R.string.media_size_89x119mm), 3504, 4685)); 152 mNameToSizeMap.put(OM_CARD, new PrintAttributes.MediaSize( 153 OM_CARD, 154 context.getString(R.string.media_size_54x86mm), 2126, 3386)); 155 mNameToSizeMap.put(OE_PHOTO_L, new PrintAttributes.MediaSize( 156 OE_PHOTO_L, 157 context.getString(R.string.media_size_l), 3500, 5000)); 158 } 159 getInstance(Context context)160 public static MediaSizes getInstance(Context context) { 161 if (sInstance == null) { 162 sInstance = new MediaSizes(context.getApplicationContext()); 163 } 164 return sInstance; 165 } 166 167 /** 168 * Return the backend code for a backend string name. 169 */ toMediaCode(String name)170 private static int toMediaCode(String name) { 171 for (Map.Entry<Integer, String> entry : sCodeToStringMap.entrySet()) { 172 if (entry.getValue().equals(name)) { 173 return entry.getKey(); 174 } 175 } 176 return 0; 177 } 178 179 /** 180 * Return the backend string for a backend code name. 181 */ toMediaName(int code)182 static String toMediaName(int code) { 183 return sCodeToStringMap.get(code); 184 } 185 186 /** 187 * Return the {@link PrintAttributes.MediaSize} object corresponding to the backend 188 * string name. 189 */ toMediaSize(String name)190 PrintAttributes.MediaSize toMediaSize(String name) { 191 return mNameToSizeMap.get(name); 192 } 193 194 /** 195 * Return backend code for a {@link PrintAttributes.MediaSize}. 196 */ toMediaCode(PrintAttributes.MediaSize mediaSize)197 public int toMediaCode(PrintAttributes.MediaSize mediaSize) { 198 for (Map.Entry<String, PrintAttributes.MediaSize> entry : mNameToSizeMap.entrySet()) { 199 // Note: media size may be oriented and not match. So check by ID. 200 if (entry.getValue().getId().equals(mediaSize.getId())) { 201 return toMediaCode(entry.getKey()); 202 } 203 } 204 return 0; 205 } 206 } 207