/*
* Copyright (C) 2012 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.sdkuilib.internal.repository.ui;
import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdklib.internal.repository.DownloadCache.Strategy;
import com.android.sdklib.util.SparseIntArray;
import com.android.sdkuilib.internal.repository.MockDownloadCache;
import com.android.sdkuilib.internal.repository.UpdaterData;
import com.android.sdkuilib.internal.repository.core.PackageLoader;
import com.android.sdkuilib.internal.repository.core.PkgCategory;
import com.android.sdkuilib.internal.repository.core.PkgContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.swt.graphics.Font;
import java.util.ArrayList;
import java.util.List;
public class MockPackagesPageImpl extends PackagesPageImpl {
public MockPackagesPageImpl(UpdaterData updaterData) {
super(updaterData);
}
/** UI is never disposed in the unit test. */
@Override
protected boolean isUiDisposed() {
return false;
}
/** Sync exec always executes immediately in the unit test, no threading is used. */
@Override
protected void syncExec(Runnable runnable) {
runnable.run();
}
@Override
protected void syncViewerSelection() {
// No-op. There is no real tree viewer to synchronize.
}
private MockTreeViewer mTreeViewer;
@Override
void postCreate() {
mTreeViewer = new MockTreeViewer();
setITreeViewer(mTreeViewer);
setIColumns(new MockTreeColumn(mTreeViewer), // columnName
new MockTreeColumn(mTreeViewer), // columnApi
new MockTreeColumn(mTreeViewer), // columnRevision
new MockTreeColumn(mTreeViewer)); // columnStatus
super.postCreate();
}
@Override
protected void refreshViewerInput() {
super.setViewerInput();
}
@Override
protected boolean isSortByApi() {
return true;
}
@Override
protected Font getTreeFontItalic() {
return null;
}
@Override
protected void loadPackages(boolean useLocalCache, boolean overrideExisting) {
super.loadPackagesImpl(useLocalCache, overrideExisting);
}
/**
* In this mock version, we use the default {@link PackageLoader} which will
* use the {@link DownloadCache} from the {@link UpdaterData}. This should be
* the mock download cache, in which case we change the strategy at run-time
* to set it to only-cache on the first manager update.
*/
@Override
protected PackageLoader getPackageLoader(boolean useLocalCache) {
DownloadCache dc = mUpdaterData.getDownloadCache();
assert dc instanceof MockDownloadCache;
if (dc instanceof MockDownloadCache) {
((MockDownloadCache) dc).overrideStrategy(useLocalCache ? Strategy.ONLY_CACHE : null);
}
return mUpdaterData.getPackageLoader();
}
/**
* Get a dump-out of the tree in a format suitable for unit testing.
*/
public String getMockTreeDisplay() throws Exception {
return mTreeViewer.getTreeDisplay();
}
private static class MockTreeViewer implements PackagesPageImpl.ICheckboxTreeViewer {
private final SparseIntArray mWidths = new SparseIntArray();
private final List<MockTreeColumn> mColumns = new ArrayList<MockTreeColumn>();
private List<PkgCategory> mInput;
private PkgContentProvider mPkgContentProvider;
private String mLastRefresh;
private static final String SPACE = " ";
@Override
public void setInput(List<PkgCategory> input) {
mInput = input;
refresh();
}
@Override
public Object getInput() {
return mInput;
}
@Override
public void setContentProvider(PkgContentProvider pkgContentProvider) {
mPkgContentProvider = pkgContentProvider;
}
@Override
public void refresh() {
// Recompute the display of the tree
StringBuilder sb = new StringBuilder();
boolean widthChanged = false;
for (int render = 0; render < (widthChanged ? 2 : 1); render++) {
widthChanged = false;
sb.setLength(0);
for (Object cat : mPkgContentProvider.getElements(mInput)) {
if (cat == null) {
continue;
}
if (sb.length() > 0) {
sb.append('\n');
}
widthChanged |= rowAsString(cat, sb, 3);
Object[] children = mPkgContentProvider.getElements(cat);
if (children == null) {
continue;
}
for (Object child : children) {
sb.append("\n L_");
widthChanged |= rowAsString(child, sb, 0);
}
}
}
mLastRefresh = sb.toString();
}
boolean rowAsString(Object element, StringBuilder sb, int space) {
boolean widthChanged = false;
sb.append("[] ");
for (int col = 0; col < mColumns.size(); col++) {
if (col > 0) {
sb.append(" | ");
}
String t = mColumns.get(col).getLabelProvider().getText(element);
if (t == null) {
t = "(null)";
}
int len = t.length();
int w = mWidths.get(col);
if (len > w) {
widthChanged = true;
mWidths.put(col, len);
w = len;
}
String pad = len >= w ? "" : SPACE.substring(SPACE.length() - w + len);
if (col == 0 && space > 0) {
sb.append(SPACE.substring(SPACE.length() - space));
}
if (col >= 1 && col <= 2) {
sb.append(pad);
}
sb.append(t);
if (col == 0 || col > 2) {
sb.append(pad);
}
}
return widthChanged;
}
@Override
public Object[] getCheckedElements() {
return null;
}
public void addColumn(MockTreeColumn mockTreeColumn) {
mColumns.add(mockTreeColumn);
}
public String getTreeDisplay() {
return mLastRefresh;
}
}
private static class MockTreeColumn implements PackagesPageImpl.ITreeViewerColumn {
private ColumnLabelProvider mLabelProvider;
public MockTreeColumn(MockTreeViewer treeViewer) {
treeViewer.addColumn(this);
}
@Override
public void setLabelProvider(ColumnLabelProvider labelProvider) {
mLabelProvider = labelProvider;
}
public ColumnLabelProvider getLabelProvider() {
return mLabelProvider;
}
}
}