blob: e4520bebd616886a23ec50aad551c8c353c9a158 [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.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);
}
}