diff options
author | Raphael Moll <ralf@android.com> | 2012-04-19 16:27:03 -0700 |
---|---|---|
committer | Raphael Moll <ralf@android.com> | 2012-05-03 12:12:22 -0700 |
commit | 87107c5cb1fb5fdafdaa94460fb6797af60fcde9 (patch) | |
tree | 01f99d040165bb3144321902d61e42399689dbc9 /sdkmanager/libs/sdkuilib | |
parent | ea0e2af1c398ad3b189a163fa574ca3d255e5895 (diff) | |
download | sdk-87107c5cb1fb5fdafdaa94460fb6797af60fcde9.zip sdk-87107c5cb1fb5fdafdaa94460fb6797af60fcde9.tar.gz sdk-87107c5cb1fb5fdafdaa94460fb6797af60fcde9.tar.bz2 |
Rework SDK Manager support for major.minor.micro revisions.
2 things in this CL:
- There's a bit of refactoring:
- PreviewVersion becomes FullVersion (which is
a full major.minor.micro.preview)
- And I introduce a MajorRevision (which is just
a major number)
- Package.getRevision() returns one of these
revision objects instead of an integer which
leads to a multide of small boring changes.
- Changed the PackageDiffLogic and its test to
adequately use the new revision; "tools preview"
packages are placed in their own category and
releases can update previews but not the reverse.
Change-Id: Ia80fd9a3791919e827ce0d183c0f297f0d27f2e6
Diffstat (limited to 'sdkmanager/libs/sdkuilib')
8 files changed, 458 insertions, 80 deletions
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java index 35e3420..6352bdb 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java @@ -107,7 +107,7 @@ public class AboutDialog extends UpdaterBaseDialog { }
}
- String revision = p.getProperty(PkgProps.PKG_REVISION);
+ String revision = p.getProperty(PkgProps.PKG_MAJOR_REV);
if (revision != null) {
return revision;
}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java index 55e7db2..a41a952 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java @@ -21,6 +21,7 @@ import com.android.sdklib.SdkConstants; import com.android.sdklib.internal.repository.archives.Archive;
import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
import com.android.sdklib.internal.repository.packages.Package;
+import com.android.sdklib.internal.repository.packages.FullRevision;
import com.android.sdklib.internal.repository.sources.SdkSource;
import com.android.sdkuilib.internal.repository.icons.ImageFactory;
import com.android.sdkuilib.ui.GridDialog;
@@ -423,8 +424,8 @@ final class SdkUpdaterChooserDialog extends GridDialog { if (aOld != null) {
Package pOld = aOld.getParentPackage();
- int rOld = pOld.getRevision();
- int rNew = pNew.getRevision();
+ FullRevision rOld = pOld.getRevision();
+ FullRevision rNew = pNew.getRevision();
boolean showRev = true;
@@ -435,17 +436,17 @@ final class SdkUpdaterChooserDialog extends GridDialog { if (!vOld.equals(vNew)) {
// Versions are different, so indicate more than just the revision.
- addText(String.format("This update will replace API %1$s revision %2$d with API %3$s revision %4$d.\n\n",
- vOld.getApiString(), rOld,
- vNew.getApiString(), rNew));
+ addText(String.format("This update will replace API %1$s revision %2$s with API %3$s revision %4$s.\n\n",
+ vOld.getApiString(), rOld.toShortString(),
+ vNew.getApiString(), rNew.toShortString()));
showRev = false;
}
}
if (showRev) {
- addText(String.format("This update will replace revision %1$d with revision %2$d.\n\n",
- rOld,
- rNew));
+ addText(String.format("This update will replace revision %1$s with revision %2$s.\n\n",
+ rOld.toShortString(),
+ rNew.toShortString()));
}
}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java index 97de564..d5ad456 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java @@ -23,12 +23,14 @@ import com.android.sdklib.internal.repository.archives.Archive; import com.android.sdklib.internal.repository.packages.AddonPackage;
import com.android.sdklib.internal.repository.packages.DocPackage;
import com.android.sdklib.internal.repository.packages.ExtraPackage;
+import com.android.sdklib.internal.repository.packages.FullRevision;
+import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
import com.android.sdklib.internal.repository.packages.IExactApiLevelDependency;
import com.android.sdklib.internal.repository.packages.IMinApiLevelDependency;
import com.android.sdklib.internal.repository.packages.IMinPlatformToolsDependency;
import com.android.sdklib.internal.repository.packages.IMinToolsDependency;
import com.android.sdklib.internal.repository.packages.IPlatformDependency;
-import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
+import com.android.sdklib.internal.repository.packages.MajorRevision;
import com.android.sdklib.internal.repository.packages.MinToolsPackage;
import com.android.sdklib.internal.repository.packages.Package;
import com.android.sdklib.internal.repository.packages.Package.UpdateInfo;
@@ -184,6 +186,14 @@ class SdkUpdaterLogic { return archives;
}
+ private double getRevisionRank(FullRevision rev) {
+ int p = rev.isPreview() ? 999 : 999 - rev.getPreview();
+ return rev.getMajor() +
+ rev.getMinor() / 1000.d +
+ rev.getMicro() / 1000000.d +
+ p / 1000000000.d;
+ }
+
/**
* Finds new packages that the user does not have in his/her local SDK
* and adds them to the list of archives to install.
@@ -212,15 +222,15 @@ class SdkUpdaterLogic { ArchiveInfo[] localArchives = createLocalArchives(localPkgs);
// Find the highest platform installed
- float currentPlatformScore = 0;
- float currentSampleScore = 0;
- float currentAddonScore = 0;
- float currentDocScore = 0;
- HashMap<String, Float> currentExtraScore = new HashMap<String, Float>();
+ double currentPlatformScore = 0;
+ double currentSampleScore = 0;
+ double currentAddonScore = 0;
+ double currentDocScore = 0;
+ HashMap<String, Double> currentExtraScore = new HashMap<String, Double>();
if (!includeAll) {
if (localPkgs != null) {
for (Package p : localPkgs) {
- int rev = p.getRevision();
+ double rev = getRevisionRank(p.getRevision());
int api = 0;
boolean isPreview = false;
if (p instanceof IAndroidVersionProvider) {
@@ -229,10 +239,10 @@ class SdkUpdaterLogic { isPreview = vers.isPreview();
}
- // The score is 10*api + (1 if preview) + rev/100
+ // The score is 1000*api + (999 if preview) + rev
// This allows previews to rank above a non-preview and
// allows revisions to rank appropriately.
- float score = api * 10 + (isPreview ? 1 : 0) + rev/100.f;
+ double score = api * 1000 + (isPreview ? 999 : 0) + rev;
if (p instanceof PlatformPackage) {
currentPlatformScore = Math.max(currentPlatformScore, score);
@@ -261,7 +271,7 @@ class SdkUpdaterLogic { continue;
}
- int rev = p.getRevision();
+ double rev = getRevisionRank(p.getRevision());
int api = 0;
boolean isPreview = false;
if (p instanceof IAndroidVersionProvider) {
@@ -270,7 +280,7 @@ class SdkUpdaterLogic { isPreview = vers.isPreview();
}
- float score = api * 10 + (isPreview ? 1 : 0) + rev/100.f;
+ double score = api * 1000 + (isPreview ? 999 : 0) + rev;
boolean shouldAdd = false;
if (p instanceof PlatformPackage) {
@@ -282,7 +292,7 @@ class SdkUpdaterLogic { } else if (p instanceof ExtraPackage) {
String key = ((ExtraPackage) p).getPath();
shouldAdd = !currentExtraScore.containsKey(key) ||
- score > currentExtraScore.get(key).floatValue();
+ score > currentExtraScore.get(key).doubleValue();
} else if (p instanceof DocPackage) {
// We don't want all the doc, only the most recent one
if (score > currentDocScore) {
@@ -673,20 +683,22 @@ class SdkUpdaterLogic { SdkSource[] remoteSources,
ArchiveInfo[] localArchives) {
// This is the requirement to match.
- int rev = pkg.getMinToolsRevision();
+ int revInt = pkg.getMinToolsRevision(); // FIXME support micro min-tools-rev
- if (rev == MinToolsPackage.MIN_TOOLS_REV_NOT_SPECIFIED) {
+ if (revInt == MinToolsPackage.MIN_TOOLS_REV_NOT_SPECIFIED) {
// Well actually there's no requirement.
return null;
}
+ MajorRevision rev = new MajorRevision(revInt);
+
// First look in locally installed packages.
for (ArchiveInfo ai : localArchives) {
Archive a = ai.getNewArchive();
if (a != null) {
Package p = a.getParentPackage();
if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision() >= rev) {
+ if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
// We found one already installed.
return null;
}
@@ -700,7 +712,7 @@ class SdkUpdaterLogic { if (a != null) {
Package p = a.getParentPackage();
if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision() >= rev) {
+ if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
// The dependency is already scheduled for install, nothing else to do.
return ai;
}
@@ -713,7 +725,7 @@ class SdkUpdaterLogic { for (Archive a : selectedArchives) {
Package p = a.getParentPackage();
if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision() >= rev) {
+ if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
// It's not already in the list of things to install, so add it now
return insertArchive(a,
outArchives,
@@ -731,7 +743,7 @@ class SdkUpdaterLogic { fetchRemotePackages(remotePkgs, remoteSources);
for (Package p : remotePkgs) {
if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision() >= rev) {
+ if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
// It's not already in the list of things to install, so add the
// first compatible archive we can find.
for (Archive a : p.getArchives()) {
@@ -752,7 +764,7 @@ class SdkUpdaterLogic { // We end up here if nothing matches. We don't have a good platform to match.
// We need to indicate this extra depends on a missing platform archive
// so that it can be impossible to install later on.
- return new MissingArchiveInfo(MissingArchiveInfo.TITLE_TOOL, rev);
+ return new MissingArchiveInfo(MissingArchiveInfo.TITLE_TOOL, revInt);
}
/**
@@ -771,12 +783,13 @@ class SdkUpdaterLogic { SdkSource[] remoteSources,
ArchiveInfo[] localArchives) {
// This is the requirement to match.
- int rev = pkg.getMinPlatformToolsRevision();
+ int revInt = pkg.getMinPlatformToolsRevision(); // FIXME support micro min-plat-tools-rev
+ FullRevision rev = new MajorRevision(revInt);
boolean findMax = false;
ArchiveInfo aiMax = null;
Archive aMax = null;
- if (rev == IMinPlatformToolsDependency.MIN_PLATFORM_TOOLS_REV_INVALID) {
+ if (revInt == IMinPlatformToolsDependency.MIN_PLATFORM_TOOLS_REV_INVALID) {
// The requirement is invalid, which is not supposed to happen since this
// property is mandatory. However in a typical upgrade scenario we can end
// up with the previous updater managing a new package and not dealing
@@ -792,11 +805,11 @@ class SdkUpdaterLogic { if (a != null) {
Package p = a.getParentPackage();
if (p instanceof PlatformToolPackage) {
- int r = ((PlatformToolPackage) p).getRevision();
- if (findMax && r > rev) {
+ FullRevision r = ((PlatformToolPackage) p).getRevision();
+ if (findMax && r.compareTo(rev) > 0) {
rev = r;
aiMax = ai;
- } else if (!findMax && r >= rev) {
+ } else if (!findMax && r.compareTo(rev) >= 0) {
// We found one already installed.
return null;
}
@@ -810,11 +823,11 @@ class SdkUpdaterLogic { if (a != null) {
Package p = a.getParentPackage();
if (p instanceof PlatformToolPackage) {
- int r = ((PlatformToolPackage) p).getRevision();
- if (findMax && r > rev) {
+ FullRevision r = ((PlatformToolPackage) p).getRevision();
+ if (findMax && r.compareTo(rev) > 0) {
rev = r;
aiMax = ai;
- } else if (!findMax && r >= rev) {
+ } else if (!findMax && r.compareTo(rev) >= 0) {
// The dependency is already scheduled for install, nothing else to do.
return ai;
}
@@ -827,12 +840,12 @@ class SdkUpdaterLogic { for (Archive a : selectedArchives) {
Package p = a.getParentPackage();
if (p instanceof PlatformToolPackage) {
- int r = ((PlatformToolPackage) p).getRevision();
- if (findMax && r > rev) {
+ FullRevision r = ((PlatformToolPackage) p).getRevision();
+ if (findMax && r.compareTo(rev) > 0) {
rev = r;
aiMax = null;
aMax = a;
- } else if (!findMax && r >= rev) {
+ } else if (!findMax && r.compareTo(rev) >= 0) {
// It's not already in the list of things to install, so add it now
return insertArchive(a,
outArchives,
@@ -850,16 +863,16 @@ class SdkUpdaterLogic { fetchRemotePackages(remotePkgs, remoteSources);
for (Package p : remotePkgs) {
if (p instanceof PlatformToolPackage) {
- int r = ((PlatformToolPackage) p).getRevision();
- if (r >= rev) {
+ FullRevision r = ((PlatformToolPackage) p).getRevision();
+ if (r.compareTo(rev) >= 0) {
// Make sure there's at least one valid archive here
for (Archive a : p.getArchives()) {
if (a.isCompatible()) {
- if (findMax && r > rev) {
+ if (findMax && r.compareTo(rev) > 0) {
rev = r;
aiMax = null;
aMax = a;
- } else if (!findMax && r >= rev) {
+ } else if (!findMax && r.compareTo(rev) >= 0) {
// It's not already in the list of things to install, so add the
// first compatible archive we can find.
return insertArchive(a,
@@ -893,7 +906,7 @@ class SdkUpdaterLogic { // We end up here if nothing matches. We don't have a good platform to match.
// We need to indicate this package depends on a missing platform archive
// so that it can be impossible to install later on.
- return new MissingArchiveInfo(MissingArchiveInfo.TITLE_PLATFORM_TOOL, rev);
+ return new MissingArchiveInfo(MissingArchiveInfo.TITLE_PLATFORM_TOOL, revInt);
}
/**
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogic.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogic.java index 687238b..8e1cbb3 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogic.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogic.java @@ -21,7 +21,9 @@ import com.android.sdklib.IAndroidTarget; import com.android.sdklib.SdkConstants; import com.android.sdklib.internal.repository.packages.ExtraPackage; import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider; +import com.android.sdklib.internal.repository.packages.IFullRevisionProvider; import com.android.sdklib.internal.repository.packages.Package; +import com.android.sdklib.internal.repository.packages.Package.UpdateInfo; import com.android.sdklib.internal.repository.packages.PlatformPackage; import com.android.sdklib.internal.repository.packages.PlatformToolPackage; import com.android.sdklib.internal.repository.packages.SystemImagePackage; @@ -80,11 +82,12 @@ class PackagesDiffLogic { /** * Mark all new and update PkgItems as checked. * - * @param selectNew If true, select all new packages - * @param selectUpdates If true, select all update packages - * @param selectTop If true, select the top platform. If the top platform has nothing installed, - * select all items in it; if it is partially installed, at least select the platform and - * system images if none of the system images are installed. + * @param selectNew If true, select all new packages (except the rc/preview ones). + * @param selectUpdates If true, select all update packages. + * @param selectTop If true, select the top platform. + * If the top platform has nothing installed, select all items in it (except the rc/preview); + * If it is partially installed, at least select the platform and system images if none of + * the system images are installed. * @param currentPlatform The {@link SdkConstants#currentPlatform()} value. */ public void checkNewUpdateItems( @@ -97,7 +100,8 @@ class PackagesDiffLogic { SparseArray<List<PkgItem>> platformItems = new SparseArray<List<PkgItem>>(); // sort items in platforms... directly deal with new/update items - for (PkgItem item : getAllPkgItems(true /*byApi*/, true /*bySource*/)) { + List<PkgItem> allItems = getAllPkgItems(true /*byApi*/, true /*bySource*/); + for (PkgItem item : allItems) { if (!item.hasCompatibleArchive()) { // Ignore items that have no archive compatible with the current platform. continue; @@ -129,8 +133,42 @@ class PackagesDiffLogic { items.add(item); } - if ((selectNew && item.getState() == PkgState.NEW) || - (selectUpdates && item.hasUpdatePkg())) { + if ((selectUpdates || selectNew) && + item.getState() == PkgState.NEW && + !item.getRevision().isPreview()) { + boolean sameFound = false; + Package newPkg = item.getMainPackage(); + if (newPkg instanceof IFullRevisionProvider) { + // We have a potential new non-preview package; but this kind of package + // supports having previews, which means we want to make sure we're not + // offering an older "new" non-preview if there's a newer preview installed. + // + // We should get into this odd situation only when updating an RC/preview + // by a final release pkg. + + IFullRevisionProvider newPkg2 = (IFullRevisionProvider) newPkg; + for (PkgItem item2 : allItems) { + if (item2.getState() == PkgState.INSTALLED) { + Package installed = item2.getMainPackage(); + + if (installed.getRevision().isPreview() && + newPkg2.sameItemAs(installed, true /*ignorePreviews*/)) { + sameFound = true; + + if (installed.canBeUpdatedBy(newPkg) == UpdateInfo.UPDATE) { + item.setChecked(true); + break; + } + } + } + } + } + + if (selectNew && !sameFound) { + item.setChecked(true); + } + + } else if (selectUpdates && item.hasUpdatePkg()) { item.setChecked(true); } } @@ -140,7 +178,8 @@ class PackagesDiffLogic { if (!installedPlatforms.contains(maxApi)) { // If the top platform has nothing installed at all, select everything in it for (PkgItem item : items) { - if (item.getState() == PkgState.NEW || item.hasUpdatePkg()) { + if ((item.getState() == PkgState.NEW && !item.getRevision().isPreview()) || + item.hasUpdatePkg()) { item.setChecked(true); } } @@ -151,7 +190,8 @@ class PackagesDiffLogic { // First make sure the platform package itself is installed, or select it. for (PkgItem item : items) { Package p = item.getMainPackage(); - if (p instanceof PlatformPackage && item.getState() == PkgState.NEW) { + if (p instanceof PlatformPackage && + item.getState() == PkgState.NEW && !item.getRevision().isPreview()) { item.setChecked(true); break; } @@ -163,7 +203,7 @@ class PackagesDiffLogic { Package p = item.getMainPackage(); if (p instanceof PlatformPackage && item.getState() == PkgState.INSTALLED) { if (item.hasUpdatePkg() && item.isChecked()) { - // If the installed platform is schedule for update, look for the + // If the installed platform is scheduled for update, look for the // system image in the update package, not the current one. p = item.getUpdatePkg(); if (p instanceof PlatformPackage) { @@ -190,6 +230,7 @@ class PackagesDiffLogic { Package p = item.getMainPackage(); if (p instanceof PlatformPackage) { if (item.getState() == PkgState.NEW && + !item.getRevision().isPreview() && ((PlatformPackage) p).getIncludedAbi() != null) { item.setChecked(true); hasSysImg = true; @@ -220,7 +261,9 @@ class PackagesDiffLogic { // On Windows, we'll also auto-select the USB driver for (PkgItem item : getAllPkgItems(true /*byApi*/, true /*bySource*/)) { Package p = item.getMainPackage(); - if (p instanceof ExtraPackage && item.getState() == PkgState.NEW) { + if (p instanceof ExtraPackage && + item.getState() == PkgState.NEW && + !item.getRevision().isPreview()) { ExtraPackage ep = (ExtraPackage) p; if (ep.getVendorId().equals("google") && //$NON-NLS-1$ ep.getPath().equals("usb_driver")) { //$NON-NLS-1$ @@ -519,7 +562,7 @@ class PackagesDiffLogic { switch (currItem.getState()) { case NEW: - if (newPkg.getRevision() < mainPkg.getRevision()) { + if (newPkg.getRevision().compareTo(mainPkg.getRevision()) < 0) { if (!op.isKeep(currItem)) { // The new item has a lower revision than the current one, // but the current one hasn't been marked as being kept so @@ -528,7 +571,7 @@ class PackagesDiffLogic { addNewItem(op, newPkg, PkgState.NEW); hasChanged = true; } - } else if (newPkg.getRevision() > mainPkg.getRevision()) { + } else if (newPkg.getRevision().compareTo(mainPkg.getRevision()) > 0) { // We have a more recent new version, remove the current one // and replace by a new one currItemIt.remove(); @@ -538,7 +581,7 @@ class PackagesDiffLogic { break; case INSTALLED: // if newPkg.revision<=mainPkg.revision: it's already installed, ignore. - if (newPkg.getRevision() > mainPkg.getRevision()) { + if (newPkg.getRevision().compareTo(mainPkg.getRevision()) > 0) { // This is a new update for the main package. if (currItem.mergeUpdate(newPkg)) { op.keep(currItem.getUpdatePkg()); @@ -611,8 +654,11 @@ class PackagesDiffLogic { return ((IAndroidVersionProvider) pkg).getAndroidVersion(); } else if (pkg instanceof ToolPackage || pkg instanceof PlatformToolPackage) { - return PkgCategoryApi.KEY_TOOLS; - + if (pkg.getRevision().isPreview()) { + return PkgCategoryApi.KEY_TOOLS_PREVIEW; + } else { + return PkgCategoryApi.KEY_TOOLS; + } } else { return PkgCategoryApi.KEY_EXTRA; } diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java index ea02e3a..51543e8 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java @@ -1313,7 +1313,7 @@ public class PackagesPage extends UpdaterPage implements ISdkChangeListener { } else if (mColumn == mColumnRevision) { if (element instanceof PkgItem) { PkgItem pkg = (PkgItem) element; - return pkg.getRevisionStr(); + return pkg.getRevision().toShortString(); } } else if (mColumn == mColumnStatus) { @@ -1343,7 +1343,7 @@ public class PackagesPage extends UpdaterPage implements ISdkChangeListener { } else if (element instanceof Package) { // This is an update package. - return "New revision " + Integer.toString(((Package) element).getRevision()); + return "New revision " + ((Package) element).getRevision().toShortString(); } } diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgCategoryApi.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgCategoryApi.java index 5bb4917..d1e3a28 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgCategoryApi.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgCategoryApi.java @@ -31,7 +31,9 @@ class PkgCategoryApi extends PkgCategory { // them. // (Note: don't use integer.max to avoid integers wrapping in comparisons. We can // revisit the day we get 2^30 platforms.) - public final static AndroidVersion KEY_TOOLS = new AndroidVersion(Integer.MAX_VALUE / 2, null);; + public final static AndroidVersion KEY_TOOLS = new AndroidVersion(Integer.MAX_VALUE / 2, null); + public final static AndroidVersion KEY_TOOLS_PREVIEW = + new AndroidVersion(Integer.MAX_VALUE / 2 - 1, null); public final static AndroidVersion KEY_EXTRA = new AndroidVersion(-1, null); public PkgCategoryApi(AndroidVersion version, String platformName, Object iconRef) { @@ -55,6 +57,8 @@ class PkgCategoryApi extends PkgCategory { AndroidVersion key = (AndroidVersion) getKey(); if (key.equals(KEY_TOOLS)) { return "TOOLS"; //$NON-NLS-1$ // for internal debug use only + } else if (key.equals(KEY_TOOLS_PREVIEW)) { + return "TOOLS-PREVIEW"; //$NON-NLS-1$ // for internal debug use only } else if (key.equals(KEY_EXTRA)) { return "EXTRAS"; //$NON-NLS-1$ // for internal debug use only } else { @@ -70,6 +74,8 @@ class PkgCategoryApi extends PkgCategory { if (key.equals(KEY_TOOLS)) { label = "Tools"; + } else if (key.equals(KEY_TOOLS_PREVIEW)) { + label = "Tools (Beta Channel)"; } else if (key.equals(KEY_EXTRA)) { label = "Extras"; } else { diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgItem.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgItem.java index ae20deb..89910cd 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgItem.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PkgItem.java @@ -17,8 +17,8 @@ package com.android.sdkuilib.internal.repository.sdkman2; import com.android.sdklib.internal.repository.archives.Archive; +import com.android.sdklib.internal.repository.packages.FullRevision; import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider; -import com.android.sdklib.internal.repository.packages.IPreviewVersionProvider; import com.android.sdklib.internal.repository.packages.Package; import com.android.sdklib.internal.repository.packages.Package.UpdateInfo; import com.android.sdklib.internal.repository.sources.SdkSource; @@ -90,17 +90,10 @@ public class PkgItem implements Comparable<PkgItem> { return mMainPkg.getListDescription(); } - public int getRevision() { + public FullRevision getRevision() { return mMainPkg.getRevision(); } - public String getRevisionStr() { - if (mMainPkg instanceof IPreviewVersionProvider) { - return ((IPreviewVersionProvider) mMainPkg).getPreviewVersion().toShortString(); - } - return Integer.toString(mMainPkg.getRevision()); - } - public String getDescription() { return mMainPkg.getDescription(); } @@ -157,24 +150,24 @@ public class PkgItem implements Comparable<PkgItem> { /** * Checks whether the main packages are of the same type and are - * not an update of each other. + * not an update of each other and have the same revision number. */ public boolean isSameMainPackageAs(Package pkg) { if (mMainPkg.canBeUpdatedBy(pkg) == UpdateInfo.NOT_UPDATE) { // package revision numbers must match - return mMainPkg.getRevision() == pkg.getRevision(); + return mMainPkg.getRevision().equals(pkg.getRevision()); } return false; } /** * Checks whether the update packages are of the same type and are - * not an update of each other. + * not an update of each other and have the same revision numbers. */ public boolean isSameUpdatePackageAs(Package pkg) { if (mUpdatePkg != null && mUpdatePkg.canBeUpdatedBy(pkg) == UpdateInfo.NOT_UPDATE) { // package revision numbers must match - return mUpdatePkg.getRevision() == pkg.getRevision(); + return mUpdatePkg.getRevision().equals(pkg.getRevision()); } return false; } diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java index a328ef1..26b39ed 100755 --- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java +++ b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java @@ -18,6 +18,7 @@ package com.android.sdkuilib.internal.repository.sdkman2; import com.android.sdklib.SdkConstants; import com.android.sdklib.internal.repository.packages.BrokenPackage; +import com.android.sdklib.internal.repository.packages.FullRevision; import com.android.sdklib.internal.repository.packages.MockAddonPackage; import com.android.sdklib.internal.repository.packages.MockBrokenPackage; import com.android.sdklib.internal.repository.packages.MockEmptyPackage; @@ -1290,7 +1291,6 @@ public class PackagesDiffLogicTest extends TestCase { } public void testBrokenAddon() { - SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); @@ -1383,8 +1383,6 @@ public class PackagesDiffLogicTest extends TestCase { } public void testToolsUpdate() { - // - SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2"); MockPlatformPackage p1; @@ -1427,6 +1425,327 @@ public class PackagesDiffLogicTest extends TestCase { "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 6>\n", getTree(m, false /*displaySortByApi*/)); } + + public void testToolsMinorUpdate() { + // Test: Check a minor revision updates an installed major revision. + + SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); + + m.updateStart(); + m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { + new MockToolPackage(3, 3), // Tools 3.0.0 + new MockPlatformToolPackage(src1, 3), + }); + m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 1), 3), // Tools 3.0.1 + }); + m.updateEnd(true /*sortByApi*/); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + + "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n", + getTree(m, false /*displaySortByApi*/)); + } + + public void testToolsPreviews() { + // Test: No local tools installed. The remote server has both tools and platforms + // in release and RC versions. + + SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); + + m.updateStart(); + m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { + new MockToolPackage(src1, new FullRevision(2, 0, 0), 3), // Tools 2 + new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1 + new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3 + new MockPlatformToolPackage(src1, new FullRevision(5, 0, 0, 1)), // Plat-T 5 rc1 + }); + m.updateEnd(true /*sortByApi*/); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 5 rc1>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 5 rc1>\n", + getTree(m, false /*displaySortByApi*/)); + } + + public void testPreviewUpdateInstalledRelease() { + // Test: Local release Tools 3.0.0 installed, server has both a release 3.0.1 available + // and a Tools Preview 4.0.0 rc1 available. + // => v3 is updated by 3.0.1 + // => v4.0.0rc1 does not update 3.0.0, instead it's a separate download. + + SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); + + m.updateStart(); + m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { + new MockToolPackage(3, 3), // tool package has no source defined + new MockPlatformToolPackage(src1, 3), + new MockPlatformPackage(src1, 1, 2, 3), // API 1 + }); + m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { + new MockToolPackage(src1, 3, 3), // Tools 3 + new MockToolPackage(src1, new FullRevision(3, 0, 1), 3), // Tools 3.0.1 + new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1 + new MockPlatformToolPackage(src1, new FullRevision(3, 0, 1)), // PT 3.0.1 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 0, 1)), // PT 4 rc1 + }); + m.updateEnd(true /*sortByApi*/); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + + "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", + getTree(m, false /*displaySortByApi*/)); + + // Now request to check new items and updates: + // Tools 4 rc1 is greater than the installed Tools 3, but it's a preview so we will NOT + // auto-select it by default even though we requested to select "NEW" packages. We + // want the user to manually opt-in into the rc/preview package. + // However Tools 3 has a 3.0.1 update that we'll auto-select. + m.checkNewUpdateItems(true, true, false, SdkConstants.PLATFORM_LINUX); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- < * INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + + "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" + + "-- < * INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" + + "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" + + "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", + getTree(m, false /*displaySortByApi*/)); + + } + + public void testPreviewUpdateInstalledPreview() { + // Test: Local preview Tools 3.0.1rc1 installed, server has both a release 3.0.0 available + // and a Tools Preview 3.0.1 rc2 available. + // => Installed 3.0.1rc1 can be updated by 3.0.1rc2 + // => There's a separate "new" download for 3.0.0, not installed and NOT updating 3.0.1rc1. + + SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1"); + + m.updateStart(); + m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 1, 1), 4), // T 3.0.1rc1 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 1)), // PT 4.0.1rc1 + new MockPlatformPackage(src1, 1, 2, 3), // API 1 + }); + m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 0), 4), // T 3.0.0 + new MockToolPackage(src1, new FullRevision(3, 0, 1, 2), 4), // T 3.0.1rc2 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 0)), // PT 4.0.0 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 2)), // PT 4.0.1 rc2 + }); + m.updateEnd(true /*sortByApi*/); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", + getTree(m, false /*displaySortByApi*/)); + + // Auto select new and update items. In this case: + // - the previews have updates available. + // - we're not selecting the non-installed "3.0" version that is older than the + // currently installed "3.0.1rc1" version since that would be a downgrade. + m.checkNewUpdateItems(true, true, false, SdkConstants.PLATFORM_LINUX); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- < * INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + + "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 3>\n" + + "-- < * INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" + + "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", + getTree(m, false /*displaySortByApi*/)); + + // ----- + + // Now simulate that the server has a final package (3.0.1) to replace the + // installed 3.0.1rc1 package. It's not installed yet, just available. + // - A new 3.0.1 will be available. + // - The server no longer lists the RC since there's a final package, yet it is + // still locally installed. + // - The 3.0.1 rc1 is not listed as having an update, since we treat the previews + // separately. TODO: consider having the 3.0.1 show up as both a new item /and/ + // as an update to the 3.0.1rc1. That may have some other side effects. + + m.uncheckAllItems(); + m.updateStart(); + m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 1, 1), 4), // T 3.0.1rc1 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 1)), // PT 4.0.1rc1 + new MockPlatformPackage(src1, 1, 2, 3), // API 1 + }); + m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1 + }); + m.updateEnd(true /*sortByApi*/); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" + + "-- <NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + + "-- <NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", + getTree(m, false /*displaySortByApi*/)); + + // Auto select new and update items. In this case the new items are considered + // updates and yet new at the same time. + // Test by selecting new items only: + m.checkNewUpdateItems(true, false, false, SdkConstants.PLATFORM_LINUX); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- < * NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + + "-- < * NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + + // Test by selecting update items only: + m.uncheckAllItems(); + m.checkNewUpdateItems(false, true, false, SdkConstants.PLATFORM_LINUX); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- < * NEW, pkg:Android SDK Tools, revision 3.0.1>\n" + + "-- < * NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + + "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Beta Channel), #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + + + // ----- + + // Now simulate that the user has installed the final package (3.0.1) to replace the + // installed 3.0.1rc1 package. + // - The 3.0.1 is installed. + // - The 3.0.1 rc1 isn't listed anymore by the server. + + m.uncheckAllItems(); + m.updateStart(); + m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1 + new MockPlatformPackage(src1, 1, 2, 3), // API 1 + }); + m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] { + new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1 + new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1 + }); + m.updateEnd(true /*sortByApi*/); + + assertEquals( + "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + + "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" + + "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n", + getTree(m, true /*displaySortByApi*/)); + assertEquals( + "PkgCategorySource <source=repo1 (1.example.com), #items=3>\n" + + "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1>\n" + + "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1>\n" + + "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n", + getTree(m, false /*displaySortByApi*/)); + } + + + // ---- /** |