blob: 2188329c2a791fd471bafcc3659db598ed3ee25f [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.sdklib;
import com.android.sdklib.io.FileOp;
import java.io.File;
/**
* Describes a system image as used by an {@link IAndroidTarget}.
* A system image has an installation path, a location type and an ABI type.
*/
public class SystemImage implements ISystemImage {
public static final String ANDROID_PREFIX = "android-"; //$NON-NLS-1$
private final LocationType mLocationtype;
private final String mAbiType;
private final File mLocation;
/**
* Creates a {@link SystemImage} description for an existing system image folder.
*
* @param location The location of an installed system image.
* @param locationType Where the system image folder is located for this ABI.
* @param abiType The ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
* {@link SdkConstants#ABI_ARMEABI_V7A} or {@link SdkConstants#ABI_INTEL_ATOM}.
*/
public SystemImage(File location, LocationType locationType, String abiType) {
mLocation = location;
mLocationtype = locationType;
mAbiType = abiType;
}
/**
* Creates a {@link SystemImage} description for a non-existing system image folder.
* The actual location is computed based on the {@code locationtype}.
*
* @param sdkManager The current SDK manager.
* @param locationType Where the system image folder is located for this ABI.
* @param abiType The ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
* {@link SdkConstants#ABI_ARMEABI_V7A} or {@link SdkConstants#ABI_INTEL_ATOM}.
* @throws IllegalArgumentException if the {@code target} used for
* {@link ISystemImage.LocationType#IN_SYSTEM_IMAGE} is not a {@link PlatformTarget}.
*/
public SystemImage(
SdkManager sdkManager,
IAndroidTarget target,
LocationType locationType,
String abiType) {
mLocationtype = locationType;
mAbiType = abiType;
File location = null;
switch(locationType) {
case IN_PLATFORM_LEGACY:
location = new File(target.getLocation(), SdkConstants.OS_IMAGES_FOLDER);
break;
case IN_PLATFORM_SUBFOLDER:
location = FileOp.append(target.getLocation(), SdkConstants.OS_IMAGES_FOLDER, abiType);
break;
case IN_SYSTEM_IMAGE:
if (!target.isPlatform()) {
throw new IllegalArgumentException(
"Add-ons do not support the system-image location type"); //$NON-NLS-1$
}
location = getCanonicalFolder(sdkManager.getLocation(), target.getVersion(), abiType);
break;
default:
// This is not supposed to happen unless LocationType is
// extended without adjusting this code.
assert false : "SystemImage used with an incorrect locationType"; //$NON-NLS-1$
}
mLocation = location;
}
/**
* Static helper method that returns the canonical path for a system-image that uses
* the {@link ISystemImage.LocationType#IN_SYSTEM_IMAGE} location type.
* <p/>
* Such an image is located in {@code SDK/system-images/android-N/abiType}.
* For this reason this method requires the root SDK as well as the platform and the ABI type.
*
* @param sdkOsPath The OS path to the SDK.
* @param platformVersion The platform version.
* @param abiType An optional ABI type. If null, the parent directory is returned.
* @return A file that represents the location of the canonical system-image folder
* for this configuration.
*/
public static File getCanonicalFolder(
String sdkOsPath,
AndroidVersion platformVersion,
String abiType) {
File root = FileOp.append(
sdkOsPath,
SdkConstants.FD_SYSTEM_IMAGES,
ANDROID_PREFIX + platformVersion.getApiString());
if (abiType == null) {
return root;
} else {
return FileOp.append(root, abiType);
}
}
/** Returns the actual location of an installed system image. */
public File getLocation() {
return mLocation;
}
/** Indicates the location strategy for this system image in the SDK. */
public LocationType getLocationType() {
return mLocationtype;
}
/**
* Returns the ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
* {@link SdkConstants#ABI_ARMEABI_V7A} or {@link SdkConstants#ABI_INTEL_ATOM}.
* Cannot be null nor empty.
*/
public String getAbiType() {
return mAbiType;
}
public int compareTo(ISystemImage other) {
// Sort by ABI name only. This is what matters from a user point of view.
return this.getAbiType().compareToIgnoreCase(other.getAbiType());
}
/**
* Generates a string representation suitable for debug purposes.
* The string is not intended to be displayed to the user.
*
* {@inheritDoc}
*/
@Override
public String toString() {
return String.format("SystemImage ABI=%s, location %s='%s'", //$NON-NLS-1$
mAbiType,
mLocationtype.toString().replace('_', ' ').toLowerCase(),
mLocation
);
}
}