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.ide.common.resources.configuration; 18 19 import java.util.regex.Matcher; 20 import java.util.regex.Pattern; 21 22 /** 23 * Resource Qualifier for Platform Version. 24 */ 25 public final class VersionQualifier extends ResourceQualifier { 26 /** Default pixel density value. This means the property is not set. */ 27 private final static int DEFAULT_VERSION = -1; 28 29 private final static Pattern sCountryCodePattern = Pattern.compile("^v(\\d+)$");//$NON-NLS-1$ 30 31 private int mVersion = DEFAULT_VERSION; 32 33 public static final String NAME = "Platform Version"; 34 35 /** 36 * Creates and returns a qualifier from the given folder segment. If the segment is incorrect, 37 * <code>null</code> is returned. 38 * @param segment the folder segment from which to create a qualifier. 39 * @return a new {@link VersionQualifier} object or <code>null</code> 40 */ 41 public static VersionQualifier getQualifier(String segment) { 42 Matcher m = sCountryCodePattern.matcher(segment); 43 if (m.matches()) { 44 String v = m.group(1); 45 46 int code = -1; 47 try { 48 code = Integer.parseInt(v); 49 } catch (NumberFormatException e) { 50 // looks like the string we extracted wasn't a valid number. 51 return null; 52 } 53 54 VersionQualifier qualifier = new VersionQualifier(); 55 qualifier.mVersion = code; 56 return qualifier; 57 } 58 59 return null; 60 } 61 62 /** 63 * Returns the folder name segment for the given value. This is equivalent to calling 64 * {@link #toString()} on a {@link VersionQualifier} object. 65 * @param version the value of the qualifier, as returned by {@link #getVersion()}. 66 */ 67 public static String getFolderSegment(int version) { 68 if (version != DEFAULT_VERSION) { 69 return String.format("v%1$d", version); //$NON-NLS-1$ 70 } 71 72 return ""; //$NON-NLS-1$ 73 } 74 75 public VersionQualifier(int apiLevel) { 76 mVersion = apiLevel; 77 } 78 79 public VersionQualifier() { 80 //pass 81 } 82 83 public int getVersion() { 84 return mVersion; 85 } 86 87 @Override 88 public String getName() { 89 return NAME; 90 } 91 92 @Override 93 public String getShortName() { 94 return "Version"; 95 } 96 97 @Override 98 public boolean isValid() { 99 return mVersion != DEFAULT_VERSION; 100 } 101 102 @Override 103 public boolean hasFakeValue() { 104 return false; 105 } 106 107 @Override 108 public boolean checkAndSet(String value, FolderConfiguration config) { 109 VersionQualifier qualifier = getQualifier(value); 110 if (qualifier != null) { 111 config.setVersionQualifier(qualifier); 112 return true; 113 } 114 115 return false; 116 } 117 118 @Override 119 public boolean equals(Object qualifier) { 120 if (qualifier instanceof VersionQualifier) { 121 return mVersion == ((VersionQualifier)qualifier).mVersion; 122 } 123 124 return false; 125 } 126 127 @Override 128 public boolean isMatchFor(ResourceQualifier qualifier) { 129 if (qualifier instanceof VersionQualifier) { 130 // it is considered a match if the api level is equal or lower to the given qualifier 131 return mVersion <= ((VersionQualifier) qualifier).mVersion; 132 } 133 134 return false; 135 } 136 137 @Override 138 public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) { 139 if (compareTo == null) { 140 return true; 141 } 142 143 VersionQualifier compareQ = (VersionQualifier)compareTo; 144 VersionQualifier referenceQ = (VersionQualifier)reference; 145 146 if (compareQ.mVersion == referenceQ.mVersion) { 147 // what we have is already the best possible match (exact match) 148 return false; 149 } else if (mVersion == referenceQ.mVersion) { 150 // got new exact value, this is the best! 151 return true; 152 } else { 153 // in all case we're going to prefer the higher version (since they have been filtered 154 // to not be too high 155 return mVersion > compareQ.mVersion; 156 } 157 } 158 159 @Override 160 public int hashCode() { 161 return mVersion; 162 } 163 164 /** 165 * Returns the string used to represent this qualifier in the folder name. 166 */ 167 @Override 168 public String getFolderSegment() { 169 return getFolderSegment(mVersion); 170 } 171 172 @Override 173 public String getShortDisplayValue() { 174 if (mVersion != DEFAULT_VERSION) { 175 return String.format("API %1$d", mVersion); 176 } 177 178 return ""; //$NON-NLS-1$ 179 } 180 181 @Override 182 public String getLongDisplayValue() { 183 if (mVersion != DEFAULT_VERSION) { 184 return String.format("API Level %1$d", mVersion); 185 } 186 187 return ""; //$NON-NLS-1$ 188 } 189 } 190