| /* |
| * 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.sdklib.repository.local; |
| |
| import com.android.SdkConstants; |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.android.sdklib.AndroidVersion; |
| import com.android.sdklib.ISystemImage; |
| import com.android.sdklib.SystemImage; |
| import com.android.sdklib.io.FileOp; |
| import com.android.sdklib.io.IFileOp; |
| import com.android.sdklib.repository.MajorRevision; |
| import com.android.sdklib.repository.PkgProps; |
| import com.android.sdklib.repository.descriptors.IPkgDesc; |
| import com.android.sdklib.repository.descriptors.IdDisplay; |
| import com.android.sdklib.repository.descriptors.PkgDesc; |
| import com.google.common.base.Objects; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Properties; |
| |
| /** |
| * Local system-image package, for a given platform's {@link AndroidVersion} |
| * and given ABI. |
| * The package itself has a major revision. |
| * There should be only one for a given android platform version & ABI. |
| */ |
| public class LocalSysImgPkgInfo extends LocalPkgInfo { |
| |
| |
| @NonNull |
| private final IPkgDesc mDesc; |
| |
| public LocalSysImgPkgInfo(@NonNull LocalSdk localSdk, |
| @NonNull File localDir, |
| @NonNull Properties sourceProps, |
| @NonNull AndroidVersion version, |
| @Nullable IdDisplay tag, |
| @NonNull String abi, |
| @NonNull MajorRevision revision) { |
| super(localSdk, localDir, sourceProps); |
| mDesc = PkgDesc.Builder.newSysImg(version, tag, abi, revision).create(); |
| } |
| |
| @NonNull |
| @Override |
| public IPkgDesc getDesc() { |
| return mDesc; |
| } |
| |
| /** |
| * Extracts the tag id & display from the properties. |
| * If missing, uses the "default" tag id. |
| */ |
| @NonNull |
| public static IdDisplay extractTagFromProps(Properties props) { |
| if (props != null) { |
| String tagId = props.getProperty(PkgProps.SYS_IMG_TAG_ID, SystemImage.DEFAULT_TAG.getId()); |
| String tagDisp = props.getProperty(PkgProps.SYS_IMG_TAG_DISPLAY, ""); //$NON-NLS-1$ |
| if (tagDisp == null || tagDisp.isEmpty()) { |
| tagDisp = tagIdToDisplay(tagId); |
| } |
| assert tagId != null; |
| assert tagDisp != null; |
| return new IdDisplay(tagId, tagDisp); |
| } |
| return SystemImage.DEFAULT_TAG; |
| } |
| |
| /** |
| * Computes a display-friendly tag string based on the tag id. |
| * This is typically used when there's no tag-display attribute. |
| * |
| * @param tagId A non-null tag id to sanitize for display. |
| * @return The tag id with all non-alphanum symbols replaced by spaces and trimmed. |
| */ |
| @NonNull |
| public static String tagIdToDisplay(@NonNull String tagId) { |
| String name; |
| name = tagId.replaceAll("[^A-Za-z0-9]+", " "); //$NON-NLS-1$ //$NON-NLS-2$ |
| name = name.replaceAll(" +", " "); //$NON-NLS-1$ //$NON-NLS-2$ |
| name = name.trim(); |
| |
| if (!name.isEmpty()) { |
| char c = name.charAt(0); |
| if (!Character.isUpperCase(c)) { |
| StringBuilder sb = new StringBuilder(name); |
| sb.replace(0, 1, String.valueOf(c).toUpperCase(Locale.US)); |
| name = sb.toString(); |
| } |
| } |
| return name; |
| } |
| |
| public SystemImage getSystemImage() { |
| return getSystemImage(mDesc, getLocalDir(), getLocalSdk().getFileOp()); |
| } |
| |
| static SystemImage getSystemImage(IPkgDesc desc, File localDir, @NonNull IFileOp fileOp) { |
| final IdDisplay tag = desc.getTag(); |
| final String abi = desc.getPath(); |
| List<File> parsedSkins = PackageParserUtils.parseSkinFolder(new File(localDir, SdkConstants.FD_SKINS), fileOp); |
| File[] skins = FileOp.EMPTY_FILE_ARRAY; |
| if (!parsedSkins.isEmpty()) { |
| skins = parsedSkins.toArray(new File[parsedSkins.size()]); |
| } |
| |
| return new SystemImage( |
| localDir, |
| ISystemImage.LocationType.IN_SYSTEM_IMAGE, |
| tag, |
| desc.getVendor(), |
| abi, |
| skins); |
| } |
| } |