17be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov/* 27be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Copyright (C) 2013 The Android Open Source Project 37be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * 47be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 57be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * you may not use this file except in compliance with the License. 67be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * You may obtain a copy of the License at 77be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * 87be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 97be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * 107be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Unless required by applicable law or agreed to in writing, software 117be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 127be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * See the License for the specific language governing permissions and 147be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * limitations under the License. 157be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov */ 167be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 17a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavpackage com.android.printspooler.util; 187be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 197be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport android.content.Context; 207be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport android.print.PrintAttributes.MediaSize; 217be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport android.util.ArrayMap; 227be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 23a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport com.android.printspooler.R; 24a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav 257be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport java.util.Comparator; 267be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganovimport java.util.Map; 277be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 287be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov/** 297be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Utility functions and classes for dealing with media sizes. 307be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov */ 31a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavpublic final class MediaSizeUtils { 327be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 337be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov private static Map<MediaSize, String> sMediaSizeToStandardMap; 347be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 35a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav private MediaSizeUtils() { 36a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav /* do nothing - hide constructor */ 37a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav } 38a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav 397be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov /** 407be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Gets the default media size for the current locale. 417be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * 427be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * @param context Context for accessing resources. 437be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * @return The default media size. 447be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov */ 457be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov public static MediaSize getDefault(Context context) { 467be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String mediaSizeId = context.getString(R.string.mediasize_default); 477be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov return MediaSize.getStandardMediaSizeById(mediaSizeId); 487be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 497be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 507be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov private static String getStandardForMediaSize(Context context, MediaSize mediaSize) { 517be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov if (sMediaSizeToStandardMap == null) { 527be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov sMediaSizeToStandardMap = new ArrayMap<MediaSize, String>(); 537be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String[] mediaSizeToStandardMapValues = context.getResources() 547be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov .getStringArray(R.array.mediasize_to_standard_map); 557be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov final int mediaSizeToStandardCount = mediaSizeToStandardMapValues.length; 567be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov for (int i = 0; i < mediaSizeToStandardCount; i += 2) { 577be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String mediaSizeId = mediaSizeToStandardMapValues[i]; 587be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov MediaSize key = MediaSize.getStandardMediaSizeById(mediaSizeId); 597be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String value = mediaSizeToStandardMapValues[i + 1]; 607be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov sMediaSizeToStandardMap.put(key, value); 617be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 627be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 637be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String standard = sMediaSizeToStandardMap.get(mediaSize); 647be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov return (standard != null) ? standard : context.getString( 657be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov R.string.mediasize_standard_iso); 667be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 677be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 687be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov /** 697be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * Comparator for ordering standard media sizes. The ones for the current 707be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * standard go to the top and the ones for the other standards follow grouped 717be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov * by standard. Media sizes of the same standard are ordered alphabetically. 727be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov */ 737be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov public static final class MediaSizeComparator implements Comparator<MediaSize> { 747be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov private final Context mContext; 757be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 767be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov public MediaSizeComparator(Context context) { 777be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov mContext = context; 787be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 797be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 807be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov @Override 817be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov public int compare(MediaSize lhs, MediaSize rhs) { 827be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String currentStandard = mContext.getString(R.string.mediasize_standard); 837be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String lhsStandard = getStandardForMediaSize(mContext, lhs); 847be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov String rhsStandard = getStandardForMediaSize(mContext, rhs); 857be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 867be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov // The current standard always wins. 877be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov if (lhsStandard.equals(currentStandard)) { 887be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov if (!rhsStandard.equals(currentStandard)) { 897be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov return -1; 907be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 917be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } else if (rhsStandard.equals(currentStandard)) { 927be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov return 1; 937be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 947be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov 957be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov if (!lhsStandard.equals(rhsStandard)) { 967be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov // Different standards - use the standard ordering. 977be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov return lhsStandard.compareTo(rhsStandard); 987be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } else { 997be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov // Same standard - sort alphabetically by label. 1007be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov return lhs.getLabel(mContext.getPackageManager()). 1017be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov compareTo(rhs.getLabel(mContext.getPackageManager())); 1027be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 1037be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 1047be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov } 1057be27acac922b5ea66ec6b464ded6f057bd6f1e5Svetoslav Ganov} 106