/* * Copyright (C) 2010 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.internal.repository.packages; import com.android.sdklib.SdkManager; import com.android.sdklib.internal.repository.IDescription; import com.android.sdklib.internal.repository.ITaskMonitor; import com.android.sdklib.internal.repository.archives.Archive; import com.android.sdklib.internal.repository.archives.Archive.Arch; import com.android.sdklib.internal.repository.archives.Archive.Os; import java.io.File; import java.util.Properties; /** * Represents an SDK repository package that is incomplete. * It has a distinct icon and a specific error that is supposed to help the user on how to fix it. */ public class BrokenPackage extends MajorRevisionPackage implements IExactApiLevelDependency, IMinApiLevelDependency { /** * The minimal API level required by this package, if > 0, * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement. */ private final int mMinApiLevel; /** * The exact API level required by this package, if > 0, * or {@link #API_LEVEL_INVALID} if there is no such requirement. */ private final int mExactApiLevel; private final String mShortDescription; private final String mLongDescription; /** * Creates a new "broken" package that represents a package that we failed to load, * for whatever error indicated in {@code longDescription}. * There is also an <em>optional</em> API level dependency that can be specified. * <p/> * By design, this creates a package with one and only one archive. */ BrokenPackage(Properties props, String shortDescription, String longDescription, int minApiLevel, int exactApiLevel, String archiveOsPath) { super( null, //source props, //properties 0, //revision will be taken from props null, //license longDescription, //description null, //descUrl Os.ANY, //archiveOs Arch.ANY, //archiveArch archiveOsPath //archiveOsPath ); mShortDescription = shortDescription; mLongDescription = longDescription; mMinApiLevel = minApiLevel; mExactApiLevel = exactApiLevel; } /** * Save the properties of the current packages in the given {@link Properties} object. * These properties will later be given to a constructor that takes a {@link Properties} object. * <p/> * Base implementation override: We don't actually save properties for a broken package. */ @Override public void saveProperties(Properties props) { // Nop. We don't actually save properties for a broken package. } /** * Returns the minimal API level required by this package, if > 0, * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement. */ @Override public int getMinApiLevel() { return mMinApiLevel; } /** * Returns the exact API level required by this package, if > 0, * or {@link #API_LEVEL_INVALID} if the value was missing. */ @Override public int getExactApiLevel() { return mExactApiLevel; } /** * Returns a string identifier to install this package from the command line. * For broken packages, we return an empty string. These are not installable. * <p/> * {@inheritDoc} */ @Override public String installId() { return ""; //$NON-NLS-1$ } /** * Returns a description of this package that is suitable for a list display. * <p/> * {@inheritDoc} */ @Override public String getListDescription() { return mShortDescription; } /** * Returns a short description for an {@link IDescription}. */ @Override public String getShortDescription() { return mShortDescription; } /** * Returns a long description for an {@link IDescription}. * * The long description uses what was given to the constructor. * If it's missing, it will use whatever the XML contains for the <description> field, * or the short description if the former is empty. */ @Override public String getLongDescription() { String s = mLongDescription; if (s != null && s.length() != 0) { return s; } s = getDescription(); if (s != null && s.length() != 0) { return s; } return getShortDescription(); } /** * We should not be attempting to install a broken package. * * {@inheritDoc} */ @Override public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) { // We should not be attempting to install a broken package. return null; } @Override public boolean sameItemAs(Package pkg) { if (pkg instanceof BrokenPackage) { return mShortDescription.equals(((BrokenPackage) pkg).mShortDescription) && getDescription().equals(pkg.getDescription()) && getMinApiLevel() == ((BrokenPackage) pkg).getMinApiLevel(); } return false; } @Override public boolean preInstallHook(Archive archive, ITaskMonitor monitor, String osSdkRoot, File installFolder) { // Nothing specific to do. return super.preInstallHook(archive, monitor, osSdkRoot, installFolder); } /** * Computes a hash of the installed content (in case of successful install.) * * {@inheritDoc} */ @Override public void postInstallHook(Archive archive, ITaskMonitor monitor, File installFolder) { // Nothing specific to do. super.postInstallHook(archive, monitor, installFolder); } }