| /* |
| * Copyright (C) 2007 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.ide.common.resources.configuration; |
| |
| import com.android.resources.Density; |
| import com.android.resources.ResourceEnum; |
| |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| /** |
| * Resource Qualifier for Screen Pixel Density. |
| */ |
| public final class DensityQualifier extends EnumBasedResourceQualifier { |
| private final static Pattern sDensityLegacyPattern = Pattern.compile("^(\\d+)dpi$");//$NON-NLS-1$ |
| |
| public static final String NAME = "Density"; |
| |
| private Density mValue = Density.MEDIUM; |
| |
| public DensityQualifier() { |
| // pass |
| } |
| |
| public DensityQualifier(Density value) { |
| mValue = value; |
| } |
| |
| public Density getValue() { |
| return mValue; |
| } |
| |
| @Override |
| ResourceEnum getEnumValue() { |
| return mValue; |
| } |
| |
| @Override |
| public String getName() { |
| return NAME; |
| } |
| |
| @Override |
| public String getShortName() { |
| return NAME; |
| } |
| |
| @Override |
| public int since() { |
| return 4; |
| } |
| |
| @Override |
| public boolean checkAndSet(String value, FolderConfiguration config) { |
| Density density = Density.getEnum(value); |
| if (density == null) { |
| |
| // attempt to read a legacy value. |
| Matcher m = sDensityLegacyPattern.matcher(value); |
| if (m.matches()) { |
| String v = m.group(1); |
| |
| try { |
| density = Density.getEnum(Integer.parseInt(v)); |
| } catch (NumberFormatException e) { |
| // looks like the string we extracted wasn't a valid number |
| // which really shouldn't happen since the regexp would have failed. |
| } |
| } |
| } |
| |
| if (density != null) { |
| DensityQualifier qualifier = new DensityQualifier(); |
| qualifier.mValue = density; |
| config.setDensityQualifier(qualifier); |
| return true; |
| } |
| |
| return false; |
| } |
| |
| @Override |
| public boolean isMatchFor(ResourceQualifier qualifier) { |
| if (qualifier instanceof DensityQualifier) { |
| // as long as there's a density qualifier, it's always a match. |
| // The best match will be found later. |
| return true; |
| } |
| |
| return false; |
| } |
| |
| @Override |
| public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) { |
| if (compareTo == null) { |
| return true; |
| } |
| |
| DensityQualifier compareQ = (DensityQualifier)compareTo; |
| DensityQualifier referenceQ = (DensityQualifier)reference; |
| |
| if (compareQ.mValue == referenceQ.mValue) { |
| // what we have is already the best possible match (exact match) |
| return false; |
| } else if (mValue == referenceQ.mValue) { |
| // got new exact value, this is the best! |
| return true; |
| } else { |
| // in all case we're going to prefer the higher dpi. |
| // if reference is high, we want highest dpi. |
| // if reference is medium, we'll prefer to scale down high dpi, than scale up low dpi |
| // if reference if low, we'll prefer to scale down high than medium (2:1 over 4:3) |
| return mValue.getDpiValue() > compareQ.mValue.getDpiValue(); |
| } |
| } |
| } |