blob: 35d1ab1ae47095bec35a49f9df57040464a9ac31 [file] [log] [blame]
/*
* Copyright (C) 2011 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 java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Resource Qualifier for Screen Pixel Density.
*/
public final class SmallestScreenWidthQualifier extends ResourceQualifier {
/** Default screen size value. This means the property is not set */
final static int DEFAULT_SIZE = -1;
private final static Pattern sParsePattern = Pattern.compile("^sw(\\d+)dp$"); //$NON-NLS-1$
private final static String sPrintPattern = "sw%1$ddp"; //$NON-NLS-1$
public static final String NAME = "Smallest Screen Width";
private int mValue = DEFAULT_SIZE;
public SmallestScreenWidthQualifier() {
// pass
}
public SmallestScreenWidthQualifier(int value) {
mValue = value;
}
public int getValue() {
return mValue;
}
@Override
public String getName() {
return NAME;
}
@Override
public String getShortName() {
return NAME;
}
@Override
public int since() {
return 13;
}
@Override
public boolean hasFakeValue() {
return false;
}
@Override
public boolean isValid() {
return mValue != DEFAULT_SIZE;
}
@Override
public boolean checkAndSet(String value, FolderConfiguration config) {
Matcher m = sParsePattern.matcher(value);
if (m.matches()) {
String v = m.group(1);
SmallestScreenWidthQualifier qualifier = getQualifier(v);
if (qualifier != null) {
config.setSmallestScreenWidthQualifier(qualifier);
return true;
}
}
return false;
}
public static SmallestScreenWidthQualifier getQualifier(String value) {
try {
int dp = Integer.parseInt(value);
SmallestScreenWidthQualifier qualifier = new SmallestScreenWidthQualifier();
qualifier.mValue = dp;
return qualifier;
} catch (NumberFormatException e) {
}
return null;
}
@Override
public boolean isMatchFor(ResourceQualifier qualifier) {
// this is the match only of the current dp value is lower or equal to the
if (qualifier instanceof SmallestScreenWidthQualifier) {
return mValue <= ((SmallestScreenWidthQualifier) qualifier).mValue;
}
return false;
}
@Override
public boolean isBetterMatchThan(ResourceQualifier compareTo, ResourceQualifier reference) {
if (compareTo == null) {
return true;
}
SmallestScreenWidthQualifier compareQ = (SmallestScreenWidthQualifier)compareTo;
SmallestScreenWidthQualifier referenceQ = (SmallestScreenWidthQualifier)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 {
// get the qualifier that has the width that is the closest to the reference, but not
// above. (which is guaranteed when this is called as isMatchFor is called first.
return mValue > compareQ.mValue;
}
}
@Override
public String getFolderSegment() {
return String.format(sPrintPattern, mValue);
}
@Override
public String getShortDisplayValue() {
if (isValid()) {
return getFolderSegment();
}
return ""; //$NON-NLS-1$
}
@Override
public String getLongDisplayValue() {
if (isValid()) {
return getFolderSegment();
}
return ""; //$NON-NLS-1$
}
@Override
public int hashCode() {
return mValue;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
SmallestScreenWidthQualifier other = (SmallestScreenWidthQualifier) obj;
if (mValue != other.mValue) {
return false;
}
return true;
}
}