From 64bd2d5f3a7a109aed560e1856242d806aa4099f Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Tue, 11 Aug 2009 18:41:54 -0700 Subject: [PATCH] Add internal support for screen size/ratio, and version qualifiers. UI will come later. BUG: 2048256, 2048264 --- .../configurations/FolderConfiguration.java | 60 ++++-- .../configurations/ScreenRatioQualifier.java | 180 +++++++++++++++++ .../configurations/ScreenSizeQualifier.java | 184 ++++++++++++++++++ .../configurations/VersionQualifier.java | 151 ++++++++++++++ .../resources/manager/ConfigMatchTest.java | 4 +- 5 files changed, 565 insertions(+), 14 deletions(-) create mode 100644 tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/ScreenRatioQualifier.java create mode 100644 tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/ScreenSizeQualifier.java create mode 100644 tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/VersionQualifier.java diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/FolderConfiguration.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/FolderConfiguration.java index ff8c26aa8..23a6440fc 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/FolderConfiguration.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/FolderConfiguration.java @@ -32,18 +32,21 @@ public final class FolderConfiguration implements Comparableconfig. @@ -108,6 +111,10 @@ public final class FolderConfiguration implements Comparable= 4 || + (version.getApiLevel() == 3 && "Donut".equals(version.getCodename()))) { + return mValue.getValue(); + } + } + + return ""; //$NON-NLS-1$ + } + + @Override + public String getStringValue() { + if (mValue != null) { + return mValue.getDisplayValue(); + } + + return ""; //$NON-NLS-1$ + } +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/ScreenSizeQualifier.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/ScreenSizeQualifier.java new file mode 100644 index 000000000..613219362 --- /dev/null +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/ScreenSizeQualifier.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php + * + * 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.eclipse.adt.internal.resources.configurations; + +import com.android.ide.eclipse.adt.internal.editors.IconFactory; +import com.android.sdklib.AndroidVersion; +import com.android.sdklib.IAndroidTarget; + +import org.eclipse.swt.graphics.Image; + +/** + * Resource Qualifier for Screen Size. Size can be "small", "normal", and "large" + */ +public class ScreenSizeQualifier extends ResourceQualifier { + + public static final String NAME = "Screen Size"; + + private ScreenSize mValue = null; + + /** + * Screen Orientation enum. + */ + public static enum ScreenSize { + SMALL("small", "Small"), //$NON-NLS-1$ + NORMAL("normal", "Normal"), //$NON-NLS-1$ + LARGE("large", "Large"); //$NON-NLS-1$ + + private String mValue; + private String mDisplayValue; + + private ScreenSize(String value, String displayValue) { + mValue = value; + mDisplayValue = displayValue; + } + + /** + * Returns the enum for matching the provided qualifier value. + * @param value The qualifier value. + * @return the enum for the qualifier value or null if no matching was found. + */ + static ScreenSize getEnum(String value) { + for (ScreenSize orient : values()) { + if (orient.mValue.equals(value)) { + return orient; + } + } + + return null; + } + + public String getValue() { + return mValue; + } + + public String getDisplayValue() { + return mDisplayValue; + } + + public static int getIndex(ScreenSize orientation) { + int i = 0; + for (ScreenSize orient : values()) { + if (orient == orientation) { + return i; + } + + i++; + } + + return -1; + } + + public static ScreenSize getByIndex(int index) { + int i = 0; + for (ScreenSize orient : values()) { + if (i == index) { + return orient; + } + i++; + } + + return null; + } + } + + public ScreenSizeQualifier() { + } + + public ScreenSizeQualifier(ScreenSize value) { + mValue = value; + } + + public ScreenSize getValue() { + return mValue; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getShortName() { + return "Size"; + } + + @Override + public Image getIcon() { + return IconFactory.getInstance().getIcon("size"); //$NON-NLS-1$ + } + + @Override + public boolean isValid() { + return mValue != null; + } + + @Override + public boolean checkAndSet(String value, FolderConfiguration config) { + ScreenSize size = ScreenSize.getEnum(value); + if (size != null) { + ScreenSizeQualifier qualifier = new ScreenSizeQualifier(size); + config.setScreenSizeQualifier(qualifier); + return true; + } + + return false; + } + + @Override + public boolean equals(Object qualifier) { + if (qualifier instanceof ScreenSizeQualifier) { + return mValue == ((ScreenSizeQualifier)qualifier).mValue; + } + + return false; + } + + @Override + public int hashCode() { + if (mValue != null) { + return mValue.hashCode(); + } + + return 0; + } + + /** + * Returns the string used to represent this qualifier in the folder name. + */ + @Override + public String getFolderSegment(IAndroidTarget target) { + if (mValue != null) { + AndroidVersion version = target.getVersion(); + if (version.getApiLevel() >= 4 || + (version.getApiLevel() == 3 && "Donut".equals(version.getCodename()))) { + return mValue.getValue(); + } + } + + return ""; //$NON-NLS-1$ + } + + @Override + public String getStringValue() { + if (mValue != null) { + return mValue.getDisplayValue(); + } + + return ""; //$NON-NLS-1$ + } +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/VersionQualifier.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/VersionQualifier.java new file mode 100644 index 000000000..c82e7e985 --- /dev/null +++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/resources/configurations/VersionQualifier.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php + * + * 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.eclipse.adt.internal.resources.configurations; + +import com.android.ide.eclipse.adt.internal.editors.IconFactory; +import com.android.sdklib.AndroidVersion; +import com.android.sdklib.IAndroidTarget; + +import org.eclipse.swt.graphics.Image; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Resource Qualifier for Platform Version. + */ +public final class VersionQualifier extends ResourceQualifier { + /** Default pixel density value. This means the property is not set. */ + private final static int DEFAULT_VERSION = -1; + + private final static Pattern sCountryCodePattern = Pattern.compile("^v(\\d+)$");//$NON-NLS-1$ + + private int mVersion = DEFAULT_VERSION; + + public static final String NAME = "Platform Version"; + + /** + * Creates and returns a qualifier from the given folder segment. If the segment is incorrect, + * null is returned. + * @param segment the folder segment from which to create a qualifier. + * @return a new {@link VersionQualifier} object or null + */ + public static VersionQualifier getQualifier(String segment) { + Matcher m = sCountryCodePattern.matcher(segment); + if (m.matches()) { + String v = m.group(1); + + int code = -1; + try { + code = Integer.parseInt(v); + } catch (NumberFormatException e) { + // looks like the string we extracted wasn't a valid number. + return null; + } + + VersionQualifier qualifier = new VersionQualifier(); + qualifier.mVersion = code; + return qualifier; + } + + return null; + } + + /** + * Returns the folder name segment for the given value. This is equivalent to calling + * {@link #toString()} on a {@link VersionQualifier} object. + * @param version the value of the qualifier, as returned by {@link #getVersion()}. + */ + public static String getFolderSegment(int version) { + if (version != DEFAULT_VERSION) { + return String.format("v%1$d", version); //$NON-NLS-1$ + } + + return ""; //$NON-NLS-1$ + } + + public int getVersion() { + return mVersion; + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getShortName() { + return "Version"; + } + + @Override + public Image getIcon() { + return IconFactory.getInstance().getIcon("version"); //$NON-NLS-1$ + } + + @Override + public boolean isValid() { + return mVersion != DEFAULT_VERSION; + } + + @Override + public boolean checkAndSet(String value, FolderConfiguration config) { + VersionQualifier qualifier = getQualifier(value); + if (qualifier != null) { + config.setVersionQualifier(qualifier); + return true; + } + + return false; + } + + @Override + public boolean equals(Object qualifier) { + if (qualifier instanceof VersionQualifier) { + return mVersion == ((VersionQualifier)qualifier).mVersion; + } + + return false; + } + + @Override + public int hashCode() { + return mVersion; + } + + /** + * Returns the string used to represent this qualifier in the folder name. + */ + @Override + public String getFolderSegment(IAndroidTarget target) { + AndroidVersion version = target.getVersion(); + if (version.getApiLevel() >= 3) { + return getFolderSegment(mVersion); + } + + return ""; //$NON-NLS-1$ + } + + @Override + public String getStringValue() { + if (mVersion != DEFAULT_VERSION) { + return String.format("v%1$d", mVersion); + } + + return ""; //$NON-NLS-1$ + } +} diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java b/tools/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java index c93f2a2f3..7601648ad 100644 --- a/tools/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java +++ b/tools/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/resources/manager/ConfigMatchTest.java @@ -34,7 +34,7 @@ import com.android.ide.eclipse.adt.internal.resources.manager.files.IFileWrapper import com.android.ide.eclipse.adt.internal.resources.manager.files.IFolderWrapper; import com.android.ide.eclipse.mock.FileMock; import com.android.ide.eclipse.mock.FolderMock; -import com.android.sdklib.SdkConstants; +import com.android.sdklib.IAndroidTarget; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -221,7 +221,7 @@ public class ConfigMatchTest extends TestCase { FileMock[] memberList) throws Exception { // figure out the folder name based on the configuration - String folderName = config.getFolderName(ResourceFolderType.LAYOUT); + String folderName = config.getFolderName(ResourceFolderType.LAYOUT, (IAndroidTarget)null); // create the folder mock FolderMock folder = new FolderMock(folderName, memberList);