1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.sdklib.internal.project; 18 19 import java.util.Collections; 20 import java.util.HashMap; 21 import java.util.Map; 22 import java.util.Map.Entry; 23 import java.util.regex.Pattern; 24 25 26 /** 27 * Settings for multiple APK generation. 28 */ 29 public class ApkSettings { 30 private final static char CHAR_EQUAL = ':'; 31 private final static char CHAR_SEP = '|'; 32 private final static String STR_SEP = Pattern.quote(new String(new char[] { CHAR_SEP })); 33 34 private boolean mSplitByDensity = false; 35 private boolean mSplitByAbi = false; 36 private final Map<String, String> mSplitByLocale; 37 38 /** 39 * Creates an ApkSettings and fills it from the project settings read from a 40 * {@link ProjectProperties} file. 41 */ ApkSettings(ProjectProperties properties)42 public ApkSettings(ProjectProperties properties) { 43 mSplitByDensity = Boolean.parseBoolean(properties.getProperty( 44 ProjectProperties.PROPERTY_SPLIT_BY_DENSITY)); 45 mSplitByAbi = Boolean.parseBoolean(properties.getProperty( 46 ProjectProperties.PROPERTY_SPLIT_BY_ABI)); 47 String locale = properties.getProperty(ProjectProperties.PROPERTY_SPLIT_BY_LOCALE); 48 if (locale != null && locale.length() > 0) { 49 mSplitByLocale = readLocaleFilters(locale); 50 } else { 51 mSplitByLocale = Collections.unmodifiableMap(new HashMap<String, String>()); 52 } 53 } 54 55 /** 56 * Indicates whether APKs should be generate for each dpi level. 57 */ isSplitByDensity()58 public boolean isSplitByDensity() { 59 return mSplitByDensity; 60 } 61 setSplitByDensity(boolean split)62 public void setSplitByDensity(boolean split) { 63 mSplitByDensity = split; 64 } 65 isSplitByAbi()66 public boolean isSplitByAbi() { 67 return mSplitByAbi; 68 } 69 setSplitByAbi(boolean split)70 public void setSplitByAbi(boolean split) { 71 mSplitByAbi = split; 72 } 73 74 /** 75 * Writes the receiver into a {@link ProjectPropertiesWorkingCopy}. 76 * @param properties the {@link ProjectPropertiesWorkingCopy} in which to store the settings. 77 */ write(ProjectPropertiesWorkingCopy properties)78 public void write(ProjectPropertiesWorkingCopy properties) { 79 properties.setProperty(ProjectProperties.PROPERTY_SPLIT_BY_DENSITY, 80 Boolean.toString(mSplitByDensity)); 81 properties.setProperty(ProjectProperties.PROPERTY_SPLIT_BY_ABI, 82 Boolean.toString(mSplitByAbi)); 83 } 84 85 @Override equals(Object obj)86 public boolean equals(Object obj) { 87 if (obj instanceof ApkSettings) { 88 ApkSettings objSettings = (ApkSettings) obj; 89 return mSplitByDensity == objSettings.mSplitByDensity && 90 mSplitByAbi == objSettings.mSplitByAbi; 91 } 92 93 return false; 94 } 95 96 @Override hashCode()97 public int hashCode() { 98 return Integer.valueOf( 99 (mSplitByDensity ? 1 : 0) + 100 (mSplitByAbi ? 2 : 0)).hashCode(); 101 } 102 readLocaleFilters(String locale)103 public static Map<String, String> readLocaleFilters(String locale) { 104 HashMap<String, String> map = new HashMap<String, String>(); 105 String[] filters = locale.split(STR_SEP); 106 for (String filter : filters) { 107 int charPos = filter.indexOf(CHAR_EQUAL); 108 if (charPos > 0) { 109 map.put(filter.substring(0, charPos), filter.substring(charPos+1)); 110 } 111 } 112 113 return Collections.unmodifiableMap(map); 114 } 115 writeLocaleFilters(Map<String, String> filterMap)116 public static String writeLocaleFilters(Map<String, String> filterMap) { 117 StringBuilder sb = new StringBuilder(); 118 119 boolean first = true; 120 for (Entry<String, String> entry : filterMap.entrySet()) { 121 if (first == false) { 122 sb.append(CHAR_SEP); 123 } 124 first = false; 125 126 sb.append(entry.getKey()); 127 sb.append(CHAR_EQUAL); 128 sb.append(entry.getValue()); 129 } 130 131 return sb.toString(); 132 } 133 getLocaleFilters()134 public Map<String, String> getLocaleFilters() { 135 return mSplitByLocale; 136 } 137 } 138