/* * Copyright (C) 2011 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; import com.android.sdklib.SdkManager; import com.android.sdklib.internal.repository.DownloadCache; import com.android.sdklib.internal.repository.ITask; import com.android.sdklib.internal.repository.ITaskFactory; import com.android.sdklib.internal.repository.ITaskMonitor; import com.android.sdklib.internal.repository.MockEmptySdkManager; import com.android.sdklib.internal.repository.NullTaskMonitor; import com.android.sdklib.internal.repository.archives.ArchiveInstaller; import com.android.sdklib.internal.repository.archives.ArchiveReplacement; import com.android.sdklib.internal.repository.sources.SdkSourceCategory; import com.android.sdklib.internal.repository.sources.SdkSources; import com.android.sdklib.mock.MockLog; import com.android.sdkuilib.internal.repository.SettingsController.Settings; import com.android.sdkuilib.internal.repository.icons.ImageFactory; import com.android.utils.ILogger; import com.android.utils.NullLogger; import org.eclipse.swt.graphics.Image; import java.util.ArrayList; import java.util.List; import java.util.Properties; /** A mock UpdaterData that simply records what would have been installed. */ public class MockUpdaterData extends UpdaterData { public final static String SDK_PATH = "/tmp/SDK"; private final List<ArchiveReplacement> mInstalled = new ArrayList<ArchiveReplacement>(); private DownloadCache mMockDownloadCache = new MockDownloadCache(); private final SdkSources mMockSdkSources = new SdkSources() { @Override public void loadUserAddons(ILogger log) { // This source does not load user addons. removeAll(SdkSourceCategory.USER_ADDONS); }; }; /** Creates a {@link MockUpdaterData} using a {@link MockEmptySdkManager}. */ public MockUpdaterData() { super(SDK_PATH, new MockLog()); setTaskFactory(new MockTaskFactory()); setImageFactory(new NullImageFactory()); } /** Creates a {@link MockUpdaterData} using the given {@link SdkManager}. */ public MockUpdaterData(SdkManager sdkManager) { super(sdkManager.getLocation(), new MockLog()); setSdkManager(sdkManager); setTaskFactory(new MockTaskFactory()); setImageFactory(new NullImageFactory()); } /** Gives access to the internal {@link #installArchives(List, int)}. */ public void _installArchives(List<ArchiveInfo> result) { installArchives(result, 0/*flags*/); } public ArchiveReplacement[] getInstalled() { return mInstalled.toArray(new ArchiveReplacement[mInstalled.size()]); } /** Overrides the sdk manager with our mock instance. */ @Override protected void initSdk() { setSdkManager(new MockEmptySdkManager(SDK_PATH)); } /** Overrides the settings controller with our mock instance. */ @Override protected SettingsController initSettingsController() { return createSettingsController(getSdkLog()); } /** Override original implementation to do nothing. */ @Override public void reloadSdk() { // nop } /** * Override original implementation to return a mock SdkSources that * does not load user add-ons from the local .android/repository.cfg file. */ @Override public SdkSources getSources() { return mMockSdkSources; } /** Returns a mock installer that simply records what would have been installed. */ @Override protected ArchiveInstaller createArchiveInstaler() { return new ArchiveInstaller() { @Override public boolean install( ArchiveReplacement archiveInfo, String osSdkRoot, boolean forceHttp, SdkManager sdkManager, DownloadCache cache, ITaskMonitor monitor) { mInstalled.add(archiveInfo); return true; } }; } /** Returns a mock download cache. */ @Override public DownloadCache getDownloadCache() { return mMockDownloadCache; } /** Overrides the mock download cache. */ public void setMockDownloadCache(DownloadCache mockDownloadCache) { mMockDownloadCache = mockDownloadCache; } public void overrideSetting(String key, boolean boolValue) { SettingsController sc = getSettingsController(); assert sc instanceof MockSettingsController; ((MockSettingsController)sc).overrideSetting(key, boolValue); } //------------ public static SettingsController createSettingsController(ILogger sdkLog) { Properties props = new Properties(); Settings settings = new Settings(props) {}; // this constructor is protected MockSettingsController controller = new MockSettingsController(sdkLog, settings); controller.setProperties(props); return controller; } static class MockSettingsController extends SettingsController { private Properties mProperties; MockSettingsController(ILogger sdkLog, Settings settings) { super(sdkLog, settings); } void setProperties(Properties properties) { mProperties = properties; } public void overrideSetting(String key, boolean boolValue) { mProperties.setProperty(key, Boolean.valueOf(boolValue).toString()); } @Override public void loadSettings() { // This mock setting controller does not load live file settings. } @Override public void saveSettings() { // This mock setting controller does not save live file settings. } } //------------ private class MockTaskFactory implements ITaskFactory { @Override public void start(String title, ITask task) { start(title, null /*parentMonitor*/, task); } @SuppressWarnings("unused") // works by side-effect of creating a new MockTask. @Override public void start(String title, ITaskMonitor parentMonitor, ITask task) { new MockTask(task); } } //------------ private static class MockTask extends NullTaskMonitor { public MockTask(ITask task) { super(NullLogger.getLogger()); task.run(this); } } //------------ private static class NullImageFactory extends ImageFactory { public NullImageFactory() { // pass super(null /*display*/); } @Override public Image getImageByName(String imageName) { return null; } @Override public Image getImageForObject(Object object) { return null; } @Override public void dispose() { // pass } } }