blob: 1b5361561d7e29797e3551ca0a2d0fc44b70267b [file] [log] [blame]
/*
* Copyright (C) 2013 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.tools.idea.model;
import com.android.annotations.NonNull;
import com.android.sdklib.AndroidVersion;
import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.ISystemImage;
import com.android.sdklib.repository.descriptors.IdDisplay;
import com.android.tools.idea.model.ManifestInfo.ActivityAttributes;
import com.android.tools.idea.rendering.ResourceHelper;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.android.AndroidTestCase;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.android.resources.ScreenSize.*;
@SuppressWarnings("javadoc")
public class ManifestInfoTest extends AndroidTestCase {
public void testGetActivityThemes1() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
"</manifest>\n");
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 0, map.size());
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL, null)));
assertEquals("@android:style/Theme", info.getDefaultTheme(null, null, null));
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE, null)));
}
public void testGetActivityThemes2() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='11'/>\n" +
"</manifest>\n");
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 0, map.size());
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE, null)));
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, LARGE, null)));
}
public void testGetActivityThemes3() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:minSdkVersion='11'/>\n" +
"</manifest>\n");
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 0, map.size());
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE, null)));
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL, null)));
}
public void testGetActivityThemes4() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <application\n" +
" android:label='@string/app_name'\n" +
" android:name='.app.TestApp' android:icon='@drawable/app_icon'>\n" +
"\n" +
" <activity\n" +
" android:name='.prefs.PrefsActivity'\n" +
" android:label='@string/prefs_title' />\n" +
"\n" +
" <activity\n" +
" android:name='.app.IntroActivity'\n" +
" android:label='@string/intro_title'\n" +
" android:theme='@android:style/Theme.Dialog' />\n" +
" </application>\n" +
" <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
"</manifest>\n" +
"");
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE, null)));
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 2, map.size());
assertNull(map.get("com.android.unittest.prefs.PrefsActivity").getTheme());
assertEquals("@android:style/Theme.Dialog", map.get("com.android.unittest.app.IntroActivity").getTheme());
}
public void testGetActivityThemes5() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <application\n" +
" android:label='@string/app_name'\n" +
" android:theme='@style/NoBackground'\n" +
" android:name='.app.TestApp' android:icon='@drawable/app_icon'>\n" +
"\n" +
" <activity\n" +
" android:name='.prefs.PrefsActivity'\n" +
" android:label='@string/prefs_title' />\n" +
"\n" +
" <activity\n" +
" android:name='.app.IntroActivity'\n" +
" android:label='@string/intro_title'\n" +
" android:theme='@android:style/Theme.Dialog' />\n" +
" </application>\n" +
" <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
"</manifest>\n" +
"");
assertEquals("@style/NoBackground", info.getDefaultTheme(null, XLARGE, null));
assertEquals("@style/NoBackground", info.getDefaultTheme(null, NORMAL, null));
assertEquals("NoBackground", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL, null)));
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 2, map.size());
assertNull(map.get("com.android.unittest.prefs.PrefsActivity").getTheme());
assertEquals("@android:style/Theme.Dialog", map.get("com.android.unittest.app.IntroActivity").getTheme());
}
public void testGetActivityThemes6() throws Exception {
// Ensures that when the *rendering* target is less than version 11, we don't
// use Holo even though the manifest SDK version calls for it.
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='11'/>\n" +
"</manifest>\n");
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 0, map.size());
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE, null)));
// Here's the check
IAndroidTarget olderVersion = new TestAndroidTarget(4);
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(olderVersion, XLARGE, null)));
}
public void testGetApplicationLabelAndIcon() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <application android:icon=\"@drawable/icon\"\n" +
" android:label=\"@string/app_name\">\n" +
" </application>\n" +
"" +
"</manifest>\n");
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 0, map.size());
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL, null)));
assertEquals("@drawable/icon", info.getApplicationIcon());
assertEquals("@string/app_name", info.getApplicationLabel());
}
public void testGetApplicationNoLabelOrIcon() throws Exception {
ManifestInfo info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <application>\n" +
" </application>\n" +
"" +
"</manifest>\n");
Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
assertEquals(map.toString(), 0, map.size());
assertEquals("com.android.unittest", info.getPackage());
assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL, null)));
assertNull(info.getApplicationIcon());
assertNull(info.getApplicationLabel());
}
private ManifestInfo getManifestInfo(String manifestContents) throws Exception {
String path = "AndroidManifest.xml";
final VirtualFile manifest = myFixture.findFileInTempDir(path);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
if (manifest != null) {
try {
manifest.delete(this);
}
catch (IOException e) {
fail("Could not delete manifest");
}
}
}
});
myFixture.addFileToProject(path, manifestContents);
// No sharing between tests:
myModule.putUserData(ManifestInfo.MANIFEST_FINDER, null);
ManifestInfo info = ManifestInfo.get(myModule, false);
info.clear();
return info;
}
@SuppressWarnings("SpellCheckingInspection")
public void testGetMinSdkVersionName() throws Exception {
ManifestInfo info;
info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
"</manifest>\n");
assertEquals(3, info.getMinSdkVersion().getApiLevel());
assertEquals("3", info.getMinSdkVersion().getApiString());
assertEquals(4, info.getTargetSdkVersion().getApiLevel());
assertNull(info.getMinSdkVersion().getCodename());
info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:targetSdkVersion='4'/>\n" +
"</manifest>\n");
assertEquals("1", info.getMinSdkVersion().getApiString());
assertEquals(1, info.getMinSdkVersion().getApiLevel());
assertEquals(4, info.getTargetSdkVersion().getApiLevel());
assertNull(info.getMinSdkVersion().getCodename());
info = getManifestInfo("<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
" package='com.android.unittest'>\n" +
" <uses-sdk android:minSdkVersion='JellyBean' />\n" +
"</manifest>\n");
assertEquals("JellyBean", info.getMinSdkVersion().getApiString());
assertEquals("JellyBean", info.getMinSdkVersion().getCodename());
}
@SuppressWarnings("ConstantConditions")
private static class TestAndroidTarget implements IAndroidTarget {
private final int mApiLevel;
public TestAndroidTarget(int apiLevel) {
mApiLevel = apiLevel;
}
@Override
public boolean canRunOn(IAndroidTarget target) {
return false;
}
@Override
public String getClasspathName() {
return null;
}
@Override
public File getDefaultSkin() {
return null;
}
@Override
public String getDescription() {
return null;
}
@Override
public String getFullName() {
return null;
}
@Override
public ISystemImage getSystemImage(@NotNull IdDisplay tag, @NotNull String abiType) {
return null;
}
@Override
public ISystemImage[] getSystemImages() {
return new ISystemImage[0];
}
@Override
public String getLocation() {
return null;
}
@Override
public String getName() {
return null;
}
@Override
public List<OptionalLibrary> getOptionalLibraries() {
return Collections.emptyList();
}
@Override
public List<OptionalLibrary> getAdditionalLibraries() {
return Collections.emptyList();
}
@Override
public IAndroidTarget getParent() {
return null;
}
@Override
public String getPath(int pathId) {
return null;
}
@Override
public File getFile(int pathId) {
return null;
}
@Override
public BuildToolInfo getBuildToolInfo() {
return null;
}
@Override
public String[] getPlatformLibraries() {
return null;
}
@Override
public Map<String, String> getProperties() {
return null;
}
@Override
public String getProperty(String name) {
return null;
}
@Override
public Integer getProperty(String name, Integer defaultValue) {
return null;
}
@Override
public Boolean getProperty(String name, Boolean defaultValue) {
return null;
}
@Override
public int getRevision() {
return 0;
}
@NotNull
@Override
public File[] getSkins() {
return null;
}
@Override
public int getUsbVendorId() {
return 0;
}
@Override
public String getVendor() {
return null;
}
@NonNull
@Override
public AndroidVersion getVersion() {
return new AndroidVersion(mApiLevel, null);
}
@Override
public String getVersionName() {
return null;
}
@Override
public String hashString() {
return null;
}
@Override
public boolean isPlatform() {
return false;
}
@Override
public int compareTo(@NotNull IAndroidTarget o) {
return 0;
}
@Override
public boolean hasRenderingLibrary() {
return false;
}
@Override
public String getShortClasspathName() {
return null;
}
@NotNull
@Override
public List<String> getBootClasspath() {
return new ArrayList<String>();
}
}
}