/* * 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; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.sdklib.repository.descriptors.IdDisplay; import com.google.common.base.Splitter; import java.util.List; /** * Helper methods to manipulate hash strings used by {@link IAndroidTarget#hashString()}. */ public abstract class AndroidTargetHash { /** * Prefix used to build hash strings for platform targets * @see SdkManager#getTargetFromHashString(String) */ public static final String PLATFORM_HASH_PREFIX = "android-"; /** * String to compute hash for add-on targets. <br/> * Format is {@code vendor:name:apiVersion}. <br/> * * <em>Important<em/>: the vendor and name compontents are the display strings, not the * newer id strings. */ public static final String ADD_ON_FORMAT = "%s:%s:%s"; //$NON-NLS-1$ /** * String used to get a hash to the platform target. * This format is compatible with the PlatformPackage.installId(). */ static final String PLATFORM_HASH = PLATFORM_HASH_PREFIX + "%s"; /** * Returns the hash string for a given platform version. * * @param version A non-null platform version. * @return A non-null hash string uniquely representing this platform target. */ @NonNull public static String getPlatformHashString(@NonNull AndroidVersion version) { return String.format(AndroidTargetHash.PLATFORM_HASH, version.getApiString()); } /** * Returns the {@link AndroidVersion} for the given hash string, * if it represents a platform. If the hash string represents a preview platform, * the returned {@link AndroidVersion} will have an unknown API level (set to 1 * or a known matching API level.) * * @param hashString the hash string (e.g. "android-19" or "android-CUPCAKE") * or a pure API level for convenience (e.g. "19" instead of the proper "android-19") * @return a platform, or null */ @Nullable public static AndroidVersion getPlatformVersion(@NonNull String hashString) { if (hashString.startsWith(PLATFORM_HASH_PREFIX)) { String suffix = hashString.substring(PLATFORM_HASH_PREFIX.length()); if (!suffix.isEmpty()) { if (Character.isDigit(suffix.charAt(0))) { try { int api = Integer.parseInt(suffix); return new AndroidVersion(api, null); } catch (NumberFormatException ignore) {} } else { int api = SdkVersionInfo.getApiByBuildCode(suffix, false); if (api < 1) { api = 1; } return new AndroidVersion(api, suffix); } } } else if (!hashString.isEmpty() && Character.isDigit(hashString.charAt(0))) { // For convenience, interpret a single integer as the proper "android-NN" form. try { int api = Integer.parseInt(hashString); return new AndroidVersion(api, null); } catch (NumberFormatException ignore) {} } return null; } @Nullable public static AndroidVersion getAddOnVersion(@NonNull String hashString) { List<String> parts = Splitter.on(':').splitToList(hashString); if (parts.size() != 3) { return null; } String apiLevelPart = parts.get(2); try { int apiLevel = Integer.parseInt(apiLevelPart); return new AndroidVersion(apiLevel, null); } catch (NumberFormatException e) { return null; } } /** * Gets the API level from a hash string, either a platform version or add-on version. * * @see #getAddOnVersion(String) * @see #getPlatformVersion(String) */ @Nullable public static AndroidVersion getVersionFromHash(@NonNull String hashString) { if (isPlatform(hashString)) { return getPlatformVersion(hashString); } else { return getAddOnVersion(hashString); } } /** * Returns the hash string for a given add-on. * * @param addonVendorDisplay A non-null vendor. When using an {@link IdDisplay} source, * this parameter should be the {@link IdDisplay#getDisplay()}. * @param addonNameDisplay A non-null add-on name. When using an {@link IdDisplay} source, * this parameter should be the {@link IdDisplay#getDisplay()}. * @param version A non-null platform version (the addon's base platform version) * @return A non-null hash string uniquely representing this add-on target. */ public static String getAddonHashString( @NonNull String addonVendorDisplay, @NonNull String addonNameDisplay, @NonNull AndroidVersion version) { return String.format(ADD_ON_FORMAT, addonVendorDisplay, addonNameDisplay, version.getApiString()); } /** * Returns the hash string for a given target (add-on or platform.) * * @param target A non-null target. * @return A non-null hash string uniquely representing this target. */ public static String getTargetHashString(@NonNull IAndroidTarget target) { if (target.isPlatform()) { return getPlatformHashString(target.getVersion()); } else { return getAddonHashString( target.getVendor(), target.getName(), target.getVersion()); } } /** * Given a hash string, indicates whether this is a platform hash string. * If not, it's an addon hash string. * * @param hashString The hash string to test. * @return True if this hash string starts by the platform prefix. */ public static boolean isPlatform(@NonNull String hashString) { return hashString.startsWith(PLATFORM_HASH_PREFIX); } }