Home | History | Annotate | Download | only in manifest
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
      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 package com.android.ide.eclipse.adt.internal.editors.manifest;
     17 
     18 import static com.android.resources.ScreenSize.LARGE;
     19 import static com.android.resources.ScreenSize.NORMAL;
     20 import static com.android.resources.ScreenSize.XLARGE;
     21 
     22 import com.android.annotations.NonNull;
     23 import com.android.ide.eclipse.adt.internal.editors.layout.refactoring.AdtProjectTest;
     24 import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
     25 import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
     26 import com.android.sdklib.AndroidVersion;
     27 import com.android.sdklib.BuildToolInfo;
     28 import com.android.sdklib.IAndroidTarget;
     29 import com.android.sdklib.ISystemImage;
     30 import com.android.sdklib.repository.descriptors.IdDisplay;
     31 
     32 import org.eclipse.core.resources.IFile;
     33 import org.eclipse.core.runtime.NullProgressMonitor;
     34 
     35 import java.io.ByteArrayInputStream;
     36 import java.io.File;
     37 import java.io.InputStream;
     38 import java.util.ArrayList;
     39 import java.util.List;
     40 import java.util.Map;
     41 
     42 @SuppressWarnings("javadoc")
     43 public class ManifestInfoTest extends AdtProjectTest {
     44     @Override
     45     protected boolean testCaseNeedsUniqueProject() {
     46         return true;
     47     }
     48 
     49     public void testGetActivityThemes1() throws Exception {
     50         ManifestInfo info = getManifestInfo(
     51                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
     52                 "    package='com.android.unittest'>\n" +
     53                 "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
     54                 "</manifest>\n");
     55         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
     56         assertEquals(map.toString(), 0, map.size());
     57         assertEquals("com.android.unittest", info.getPackage());
     58         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
     59         assertEquals("@android:style/Theme", info.getDefaultTheme(null, null));
     60         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE)));
     61     }
     62 
     63     public void testGetActivityThemes2() throws Exception {
     64         ManifestInfo info = getManifestInfo(
     65                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
     66                 "    package='com.android.unittest'>\n" +
     67                 "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='11'/>\n" +
     68                 "</manifest>\n");
     69         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
     70         assertEquals(map.toString(), 0, map.size());
     71         assertEquals("com.android.unittest", info.getPackage());
     72         assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
     73                 XLARGE)));
     74         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, LARGE)));
     75     }
     76 
     77     public void testGetActivityThemes3() throws Exception {
     78         ManifestInfo info = getManifestInfo(
     79                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
     80                 "    package='com.android.unittest'>\n" +
     81                 "    <uses-sdk android:minSdkVersion='11'/>\n" +
     82                 "</manifest>\n");
     83         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
     84         assertEquals(map.toString(), 0, map.size());
     85         assertEquals("com.android.unittest", info.getPackage());
     86         assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
     87                 XLARGE)));
     88         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
     89     }
     90 
     91     public void testGetActivityThemes4() throws Exception {
     92         ManifestInfo info = getManifestInfo(
     93                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
     94                 "    package='com.android.unittest'>\n" +
     95                 "    <application\n" +
     96                 "        android:label='@string/app_name'\n" +
     97                 "        android:name='.app.TestApp' android:icon='@drawable/app_icon'>\n" +
     98                 "\n" +
     99                 "        <activity\n" +
    100                 "            android:name='.prefs.PrefsActivity'\n" +
    101                 "            android:label='@string/prefs_title' />\n" +
    102                 "\n" +
    103                 "        <activity\n" +
    104                 "            android:name='.app.IntroActivity'\n" +
    105                 "            android:label='@string/intro_title'\n" +
    106                 "            android:theme='@android:style/Theme.Dialog' />\n" +
    107                 "    </application>\n" +
    108                 "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
    109                 "</manifest>\n" +
    110                 ""
    111                 );
    112         assertEquals("com.android.unittest", info.getPackage());
    113         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, XLARGE)));
    114 
    115         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
    116         assertEquals(map.toString(), 2, map.size());
    117         assertNull(map.get("com.android.unittest.prefs.PrefsActivity").getTheme());
    118         assertEquals("@android:style/Theme.Dialog",
    119                 map.get("com.android.unittest.app.IntroActivity").getTheme());
    120     }
    121 
    122     public void testGetActivityThemes5() throws Exception {
    123         ManifestInfo info = getManifestInfo(
    124                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    125                 "    package='com.android.unittest'>\n" +
    126                 "    <application\n" +
    127                 "        android:label='@string/app_name'\n" +
    128                 "        android:theme='@style/NoBackground'\n" +
    129                 "        android:name='.app.TestApp' android:icon='@drawable/app_icon'>\n" +
    130                 "\n" +
    131                 "        <activity\n" +
    132                 "            android:name='.prefs.PrefsActivity'\n" +
    133                 "            android:label='@string/prefs_title' />\n" +
    134                 "\n" +
    135                 "        <activity\n" +
    136                 "            android:name='.app.IntroActivity'\n" +
    137                 "            android:label='@string/intro_title'\n" +
    138                 "            android:theme='@android:style/Theme.Dialog' />\n" +
    139                 "    </application>\n" +
    140                 "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
    141                 "</manifest>\n" +
    142                 ""
    143                 );
    144 
    145         assertEquals("@style/NoBackground", info.getDefaultTheme(null, XLARGE));
    146         assertEquals("@style/NoBackground", info.getDefaultTheme(null, NORMAL));
    147         assertEquals("NoBackground", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
    148                 NORMAL)));
    149 
    150         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
    151         assertEquals(map.toString(), 2, map.size());
    152         assertNull(map.get("com.android.unittest.prefs.PrefsActivity").getTheme());
    153         assertEquals("@android:style/Theme.Dialog",
    154                 map.get("com.android.unittest.app.IntroActivity").getTheme());
    155     }
    156 
    157     public void testGetActivityThemes6() throws Exception {
    158         // Ensures that when the *rendering* target is less than version 11, we don't
    159         // use Holo even though the manifest SDK version calls for it.
    160         ManifestInfo info = getManifestInfo(
    161                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    162                 "    package='com.android.unittest'>\n" +
    163                 "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='11'/>\n" +
    164                 "</manifest>\n");
    165         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
    166         assertEquals(map.toString(), 0, map.size());
    167         assertEquals("com.android.unittest", info.getPackage());
    168         assertEquals("Theme.Holo", ResourceHelper.styleToTheme(info.getDefaultTheme(null,
    169                 XLARGE)));
    170 
    171         // Here's the check
    172         IAndroidTarget olderVersion = new TestAndroidTarget(4);
    173         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(olderVersion,
    174                 XLARGE)));
    175 
    176     }
    177 
    178     public void testGetApplicationLabelAndIcon() throws Exception {
    179         ManifestInfo info = getManifestInfo(
    180                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    181                 "    package='com.android.unittest'>\n" +
    182                 "    <application android:icon=\"@drawable/icon\"\n" +
    183                 "                 android:label=\"@string/app_name\">\n" +
    184                 "    </application>\n" +
    185                 "" +
    186                 "</manifest>\n");
    187         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
    188         assertEquals(map.toString(), 0, map.size());
    189         assertEquals("com.android.unittest", info.getPackage());
    190 
    191         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
    192         assertEquals("@drawable/icon", info.getApplicationIcon());
    193         assertEquals("@string/app_name", info.getApplicationLabel());
    194     }
    195 
    196     public void testGetApplicationNoLabelOrIcon() throws Exception {
    197         ManifestInfo info = getManifestInfo(
    198                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    199                 "    package='com.android.unittest'>\n" +
    200                 "    <application>\n" +
    201                 "    </application>\n" +
    202                 "" +
    203                 "</manifest>\n");
    204         Map<String, ActivityAttributes> map = info.getActivityAttributesMap();
    205         assertEquals(map.toString(), 0, map.size());
    206         assertEquals("com.android.unittest", info.getPackage());
    207 
    208         assertEquals("Theme", ResourceHelper.styleToTheme(info.getDefaultTheme(null, NORMAL)));
    209         assertNull(info.getApplicationIcon());
    210         assertNull(info.getApplicationLabel());
    211     }
    212 
    213     private ManifestInfo getManifestInfo(String manifestContents) throws Exception {
    214         InputStream bstream = new ByteArrayInputStream(
    215                 manifestContents.getBytes("UTF-8")); //$NON-NLS-1$
    216 
    217         IFile file = getProject().getFile("AndroidManifest.xml");
    218         if (file.exists()) {
    219             file.setContents(bstream, IFile.FORCE, new NullProgressMonitor());
    220         } else {
    221             file.create(bstream, false /* force */, new NullProgressMonitor());
    222         }
    223         ManifestInfo info = ManifestInfo.get(getProject());
    224         info.clear();
    225         return info;
    226     }
    227 
    228     public void testGetMinSdkVersionName() throws Exception {
    229         ManifestInfo info;
    230 
    231         info = getManifestInfo(
    232                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    233                 "    package='com.android.unittest'>\n" +
    234                 "    <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='4'/>\n" +
    235                 "</manifest>\n");
    236         assertEquals(3, info.getMinSdkVersion());
    237         assertEquals("3", info.getMinSdkName());
    238         assertEquals(4, info.getTargetSdkVersion());
    239         assertNull(info.getMinSdkCodeName());
    240 
    241         info = getManifestInfo(
    242                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    243                 "    package='com.android.unittest'>\n" +
    244                 "    <uses-sdk android:targetSdkVersion='4'/>\n" +
    245                 "</manifest>\n");
    246         assertEquals("1", info.getMinSdkName());
    247         assertEquals(1, info.getMinSdkVersion());
    248         assertEquals(4, info.getTargetSdkVersion());
    249         assertNull(info.getMinSdkCodeName());
    250 
    251         info = getManifestInfo(
    252                 "<manifest xmlns:android='http://schemas.android.com/apk/res/android'\n" +
    253                 "    package='com.android.unittest'>\n" +
    254                 "    <uses-sdk android:minSdkVersion='JellyBean' />\n" +
    255                 "</manifest>\n");
    256         assertEquals("JellyBean", info.getMinSdkName());
    257         assertEquals("JellyBean", info.getMinSdkCodeName());
    258     }
    259 
    260     private static class TestAndroidTarget implements IAndroidTarget {
    261         private final int mApiLevel;
    262 
    263         public TestAndroidTarget(int apiLevel) {
    264             mApiLevel = apiLevel;
    265         }
    266 
    267         @Override
    268         public boolean canRunOn(IAndroidTarget target) {
    269             return false;
    270         }
    271 
    272         @Override
    273         public String getClasspathName() {
    274             return null;
    275         }
    276 
    277         @Override
    278         public File getDefaultSkin() {
    279             return null;
    280         }
    281 
    282         @Override
    283         public String getDescription() {
    284             return null;
    285         }
    286 
    287         @Override
    288         public String getFullName() {
    289             return null;
    290         }
    291 
    292         @Override
    293         public ISystemImage getSystemImage(IdDisplay tag, String abiType) {
    294             return null;
    295         }
    296 
    297         @Override
    298         public ISystemImage[] getSystemImages() {
    299             return new ISystemImage[0];
    300         }
    301 
    302         @Override
    303         public String getLocation() {
    304             return null;
    305         }
    306 
    307         @Override
    308         public String getName() {
    309             return null;
    310         }
    311 
    312         @Override
    313         public IOptionalLibrary[] getOptionalLibraries() {
    314             return null;
    315         }
    316 
    317         @Override
    318         public IAndroidTarget getParent() {
    319             return null;
    320         }
    321 
    322         @Override
    323         public String getPath(int pathId) {
    324             return null;
    325         }
    326 
    327         @Override
    328         public File getFile(int pathId) {
    329           return null;
    330         }
    331 
    332 
    333         @Override
    334         public String[] getPlatformLibraries() {
    335             return null;
    336         }
    337 
    338         @Override
    339         public Map<String, String> getProperties() {
    340             return null;
    341         }
    342 
    343         @Override
    344         public String getProperty(String name) {
    345             return null;
    346         }
    347 
    348         @Override
    349         public Integer getProperty(String name, Integer defaultValue) {
    350             return null;
    351         }
    352 
    353         @Override
    354         public Boolean getProperty(String name, Boolean defaultValue) {
    355             return null;
    356         }
    357 
    358         @Override
    359         public int getRevision() {
    360             return 0;
    361         }
    362 
    363         @Override
    364         public File[] getSkins() {
    365             return null;
    366         }
    367 
    368         @Override
    369         public int getUsbVendorId() {
    370             return 0;
    371         }
    372 
    373         @Override
    374         public String getVendor() {
    375             return null;
    376         }
    377 
    378         @Override
    379         public AndroidVersion getVersion() {
    380             return new AndroidVersion(mApiLevel, null);
    381         }
    382 
    383         @Override
    384         public String getVersionName() {
    385             return null;
    386         }
    387 
    388         @Override
    389         public String hashString() {
    390             return null;
    391         }
    392 
    393         @Override
    394         public boolean isPlatform() {
    395             return false;
    396         }
    397 
    398         @Override
    399         public int compareTo(IAndroidTarget o) {
    400             return 0;
    401         }
    402 
    403         @Override
    404         public boolean hasRenderingLibrary() {
    405             return false;
    406         }
    407 
    408         @Override
    409         public String getShortClasspathName() {
    410             return null;
    411         }
    412 
    413         @Override
    414         @NonNull
    415         public List<String> getBootClasspath() {
    416             return new ArrayList<String>();
    417         }
    418 
    419         @Override
    420         public BuildToolInfo getBuildToolInfo() {
    421             return null;
    422         }
    423     }
    424 }
    425