diff options
author | Raphael Moll <ralf@android.com> | 2011-07-27 13:23:08 -0700 |
---|---|---|
committer | Android Code Review <code-review@android.com> | 2011-07-27 13:23:08 -0700 |
commit | f121d66d16b8260f4711bf36f4fb8fd1f62c0943 (patch) | |
tree | 911819d560a21e43aee4948ed437282116cfc4b3 | |
parent | 0e85f0e424c690242892a2d7beedf8c72e337082 (diff) | |
parent | d6e24bcd244afd7052a4b087187bb6077117678b (diff) | |
download | sdk-f121d66d16b8260f4711bf36f4fb8fd1f62c0943.zip sdk-f121d66d16b8260f4711bf36f4fb8fd1f62c0943.tar.gz sdk-f121d66d16b8260f4711bf36f4fb8fd1f62c0943.tar.bz2 |
Merge changes I984ae397,I24f74378
* changes:
SDK Man2: Clear local source caches when reloading.
A few minor UI tweaks to SDK Manager 2.
-rwxr-xr-x | sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSources.java | 16 | ||||
-rwxr-xr-x | sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java | 66 |
2 files changed, 71 insertions, 11 deletions
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSources.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSources.java index d4622ad..0b57eb1 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSources.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSources.java @@ -157,6 +157,22 @@ public class SdkSources { }
/**
+ * Each source keeps a local cache of whatever it loaded recently.
+ * This calls {@link SdkSource#clearPackages()} on all the available sources,
+ * and the next call to {@link SdkSource#getPackages()} will actually reload
+ * the remote package list.
+ */
+ public void clearAllPackages() {
+ synchronized(mSources) {
+ for (ArrayList<SdkSource> list : mSources.values()) {
+ for (SdkSource source : list) {
+ source.clearPackages();
+ }
+ }
+ }
+ }
+
+ /**
* Returns the category of a given source, or null if the source is unknown.
* <p/>
* Note that this method uses object identity to find a given source, and does
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java index fd5f3c9..0d6dd7a 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java @@ -49,6 +49,7 @@ import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeColumnViewerLabelProvider; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; @@ -189,6 +190,12 @@ public class PackagesPage extends UpdaterPage GridLayoutBuilder.create(mGroupPackages).columns(1); mTreeViewer = new CheckboxTreeViewer(mGroupPackages, SWT.BORDER); + mTreeViewer.addFilter(new ViewerFilter() { + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + return filterViewerItem(element); + } + }); mTreeViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { @@ -375,6 +382,9 @@ public class PackagesPage extends UpdaterPage switch (action) { case RELOAD: + // Clear all source caches, otherwise loading will use the cached data + mDiffLogic.mUpdaterData.getLocalSdkParser().clearPackages(); + mDiffLogic.mUpdaterData.getSources().clearAllPackages(); loadPackages(); break; case SHOW_ADDON_SITES: @@ -522,6 +532,12 @@ public class PackagesPage extends UpdaterPage // disposed yet. Otherwise hilarity ensues. final boolean useSortByApi = isSortByApi(); + + if (!mTreeColumnName.isDisposed()) { + mTreeColumnName.setImage( + getImage(useSortByApi ? ICON_SORT_BY_API : ICON_SORT_BY_SOURCE)); + } + final UpdateOp op = mDiffLogic.updateStart(useSortByApi); mDiffLogic.mPackageLoader.loadPackages(new ISourceLoadedCallback() { boolean needsRefresh = mDiffLogic.isSortByApi() == useSortByApi; @@ -583,22 +599,42 @@ public class PackagesPage extends UpdaterPage /** * Decide whether to keep an item in the current tree based on user-chosen filter options. */ - private boolean keepItem(PkgItem item) { - if (!mCheckFilterObsolete.getSelection()) { - if (item.isObsolete()) { + private boolean filterViewerItem(Object treeElement) { + if (treeElement instanceof PkgCategory) { + PkgCategory cat = (PkgCategory) treeElement; + + if (!cat.getItems().isEmpty()) { + // A category is hidden if all of its content is hidden. + // However empty categories are always visible. + for (PkgItem item : cat.getItems()) { + if (filterViewerItem(item)) { + // We found at least one element that is visible. + return true; + } + } return false; } } - if (!mCheckFilterInstalled.getSelection()) { - if (item.getState() == PkgState.INSTALLED) { - return false; + if (treeElement instanceof PkgItem) { + PkgItem item = (PkgItem) treeElement; + + if (!mCheckFilterObsolete.getSelection()) { + if (item.isObsolete()) { + return false; + } } - } - if (!mCheckFilterNew.getSelection()) { - if (item.getState() == PkgState.NEW || item.hasUpdatePkg()) { - return false; + if (!mCheckFilterInstalled.getSelection()) { + if (item.getState() == PkgState.INSTALLED) { + return false; + } + } + + if (!mCheckFilterNew.getSelection()) { + if (item.getState() == PkgState.NEW || item.hasUpdatePkg()) { + return false; + } } } @@ -1009,7 +1045,6 @@ public class PackagesPage extends UpdaterPage // When sorting by API, the package name might contains the API number // or the platform name at the end. If we find it, cut it out since it's // redundant. - // TODO deal with obsolete packages PkgApiCategory cat = (PkgApiCategory) findCategoryForItem(item); String apiLabel = cat.getApiLabel(); @@ -1020,9 +1055,18 @@ public class PackagesPage extends UpdaterPage } else if (apiLabel != null && name.endsWith(apiLabel)) { return name.substring(0, name.length() - apiLabel.length()); + + } else if (platLabel != null && item.isObsolete() && name.indexOf(platLabel) > 0) { + // For obsolete items, the format is "<base name> <platform name> (Obsolete)" + // so in this case only accept removing a platform name that is not at + // the end. + name = name.replace(platLabel, ""); //$NON-NLS-1$ } } + // Collapse potential duplicated spacing + name = name.replaceAll(" +", " "); //$NON-NLS-1$ //$NON-NLS-2$ + return name; } |