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