/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.sdklib.internal.project; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; /** * Settings for multiple APK generation. */ public class ApkSettings { private final static char CHAR_EQUAL = ':'; private final static char CHAR_SEP = '|'; private final static String STR_SEP = Pattern.quote(new String(new char[] { CHAR_SEP })); private boolean mSplitByDensity = false; private boolean mSplitByAbi = false; private final Map<String, String> mSplitByLocale; /** * Creates an ApkSettings and fills it from the project settings read from a * {@link ProjectProperties} file. */ public ApkSettings(ProjectProperties properties) { mSplitByDensity = Boolean.parseBoolean(properties.getProperty( ProjectProperties.PROPERTY_SPLIT_BY_DENSITY)); mSplitByAbi = Boolean.parseBoolean(properties.getProperty( ProjectProperties.PROPERTY_SPLIT_BY_ABI)); String locale = properties.getProperty(ProjectProperties.PROPERTY_SPLIT_BY_LOCALE); if (locale != null && locale.length() > 0) { mSplitByLocale = readLocaleFilters(locale); } else { mSplitByLocale = Collections.unmodifiableMap(new HashMap<String, String>()); } } /** * Indicates whether APKs should be generate for each dpi level. */ public boolean isSplitByDensity() { return mSplitByDensity; } public void setSplitByDensity(boolean split) { mSplitByDensity = split; } public boolean isSplitByAbi() { return mSplitByAbi; } public void setSplitByAbi(boolean split) { mSplitByAbi = split; } /** * Writes the receiver into a {@link ProjectPropertiesWorkingCopy}. * @param properties the {@link ProjectPropertiesWorkingCopy} in which to store the settings. */ public void write(ProjectPropertiesWorkingCopy properties) { properties.setProperty(ProjectProperties.PROPERTY_SPLIT_BY_DENSITY, Boolean.toString(mSplitByDensity)); properties.setProperty(ProjectProperties.PROPERTY_SPLIT_BY_ABI, Boolean.toString(mSplitByAbi)); } @Override public boolean equals(Object obj) { if (obj instanceof ApkSettings) { ApkSettings objSettings = (ApkSettings) obj; return mSplitByDensity == objSettings.mSplitByDensity && mSplitByAbi == objSettings.mSplitByAbi; } return false; } @Override public int hashCode() { return Integer.valueOf( (mSplitByDensity ? 1 : 0) + (mSplitByAbi ? 2 : 0)).hashCode(); } public static Map<String, String> readLocaleFilters(String locale) { HashMap<String, String> map = new HashMap<String, String>(); String[] filters = locale.split(STR_SEP); for (String filter : filters) { int charPos = filter.indexOf(CHAR_EQUAL); if (charPos > 0) { map.put(filter.substring(0, charPos), filter.substring(charPos+1)); } } return Collections.unmodifiableMap(map); } public static String writeLocaleFilters(Map<String, String> filterMap) { StringBuilder sb = new StringBuilder(); boolean first = true; for (Entry<String, String> entry : filterMap.entrySet()) { if (first == false) { sb.append(CHAR_SEP); } first = false; sb.append(entry.getKey()); sb.append(CHAR_EQUAL); sb.append(entry.getValue()); } return sb.toString(); } public Map<String, String> getLocaleFilters() { return mSplitByLocale; } }