/*
* 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;
import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdklib.internal.repository.DownloadCache.Strategy;
import com.android.sdklib.util.FormatUtils;
import com.android.sdkuilib.ui.GridDataBuilder;
import com.android.sdkuilib.ui.GridLayoutBuilder;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import java.util.Properties;
public class SettingsDialog extends UpdaterBaseDialog implements ISettingsPage {
// data members
private final DownloadCache mDownloadCache = new DownloadCache(Strategy.SERVE_CACHE);
private final SettingsController mSettingsController;
private SettingsChangedCallback mSettingsChangedCallback;
// UI widgets
private Text mTextProxyServer;
private Text mTextProxyPort;
private Text mTextCacheSize;
private Button mCheckUseCache;
private Button mCheckForceHttp;
private Button mCheckAskAdbRestart;
private Button mCheckEnablePreviews;
private SelectionAdapter mApplyOnSelected = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
applyNewSettings(); //$hide$
}
};
private ModifyListener mApplyOnModified = new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
applyNewSettings(); //$hide$
}
};
public SettingsDialog(Shell parentShell, UpdaterData updaterData) {
super(parentShell, updaterData, "Settings" /*title*/);
assert updaterData != null;
mSettingsController = updaterData.getSettingsController();
}
@Override
protected void createShell() {
super.createShell();
Shell shell = getShell();
shell.setMinimumSize(new Point(450, 370));
shell.setSize(450, 400);
}
@Override
protected void createContents() {
super.createContents();
Shell shell = getShell();
Group group = new Group(shell, SWT.NONE);
group.setText("Proxy Settings");
GridDataBuilder.create(group).fill().grab().hSpan(2);
GridLayoutBuilder.create(group).columns(2);
Label label = new Label(group, SWT.NONE);
GridDataBuilder.create(label).hRight().vCenter();
label.setText("HTTP Proxy Server");
String tooltip = "The hostname or IP of the HTTP & HTTPS proxy server to use (e.g. proxy.example.com).\n" +
"When empty, the default Java proxy setting is used.";
label.setToolTipText(tooltip);
mTextProxyServer = new Text(group, SWT.BORDER);
GridDataBuilder.create(mTextProxyServer).hFill().hGrab().vCenter();
mTextProxyServer.addModifyListener(mApplyOnModified);
mTextProxyServer.setToolTipText(tooltip);
label = new Label(group, SWT.NONE);
GridDataBuilder.create(label).hRight().vCenter();
label.setText("HTTP Proxy Port");
tooltip = "The port of the HTTP & HTTPS proxy server to use (e.g. 3128).\n" +
"When empty, the default Java proxy setting is used.";
label.setToolTipText(tooltip);
mTextProxyPort = new Text(group, SWT.BORDER);
GridDataBuilder.create(mTextProxyPort).hFill().hGrab().vCenter();
mTextProxyPort.addModifyListener(mApplyOnModified);
mTextProxyPort.setToolTipText(tooltip);
// ----
group = new Group(shell, SWT.NONE);
group.setText("Manifest Cache");
GridDataBuilder.create(group).fill().grab().hSpan(2);
GridLayoutBuilder.create(group).columns(3);
label = new Label(group, SWT.NONE);
GridDataBuilder.create(label).hRight().vCenter();
label.setText("Directory:");
Text text = new Text(group, SWT.NONE);
GridDataBuilder.create(text).hFill().hGrab().vCenter().hSpan(2);
text.setEnabled(false);
text.setText(mDownloadCache.getCacheRoot().getAbsolutePath());
label = new Label(group, SWT.NONE);
GridDataBuilder.create(label).hRight().vCenter();
label.setText("Current Size:");
mTextCacheSize = new Text(group, SWT.NONE);
GridDataBuilder.create(mTextCacheSize).hFill().hGrab().vCenter().hSpan(2);
mTextCacheSize.setEnabled(false);
updateDownloadCacheSize();
mCheckUseCache = new Button(group, SWT.CHECK);
GridDataBuilder.create(mCheckUseCache).vCenter().hSpan(1);
mCheckUseCache.setText("Use download cache");
mCheckUseCache.setToolTipText("When checked, small manifest files are cached locally.\n" +
"Large binary files are never cached locally.");
mCheckUseCache.addSelectionListener(mApplyOnSelected);
label = new Label(group, SWT.NONE);
GridDataBuilder.create(label).hFill().hGrab().hSpan(1);
Button button = new Button(group, SWT.PUSH);
GridDataBuilder.create(button).vCenter().hSpan(1);
button.setText("Clear Cache");
button.setToolTipText("Deletes all cached files.");
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
mDownloadCache.clearCache();
updateDownloadCacheSize();
}
});
// ----
group = new Group(shell, SWT.NONE);
group.setText("Others");
GridDataBuilder.create(group).fill().grab().hSpan(2);
GridLayoutBuilder.create(group).columns(2);
mCheckForceHttp = new Button(group, SWT.CHECK);
GridDataBuilder.create(mCheckForceHttp).hFill().hGrab().vCenter().hSpan(2);
mCheckForceHttp.setText("Force https://... sources to be fetched using http://...");
mCheckForceHttp.setToolTipText(
"If you are not able to connect to the official Android repository using HTTPS,\n" +
"enable this setting to force accessing it via HTTP.");
mCheckForceHttp.addSelectionListener(mApplyOnSelected);
mCheckAskAdbRestart = new Button(group, SWT.CHECK);
GridDataBuilder.create(mCheckAskAdbRestart).hFill().hGrab().vCenter().hSpan(2);
mCheckAskAdbRestart.setText("Ask before restarting ADB");
mCheckAskAdbRestart.setToolTipText(
"When checked, the user will be asked for permission to restart ADB\n" +
"after updating an addon-on package or a tool package.");
mCheckAskAdbRestart.addSelectionListener(mApplyOnSelected);
mCheckEnablePreviews = new Button(group, SWT.CHECK);
GridDataBuilder.create(mCheckEnablePreviews).hFill().hGrab().vCenter().hSpan(2);
mCheckEnablePreviews.setText("Enable Preview Tools");
mCheckEnablePreviews.setToolTipText(
"When checked, the package list will also display preview versions of the tools.\n" +
"These are optional future release candidates that the Android tools team\n" +
"publishes from time to time for early feedback.");
mCheckEnablePreviews.addSelectionListener(mApplyOnSelected);
Label filler = new Label(shell, SWT.NONE);
GridDataBuilder.create(filler).hFill().hGrab();
createCloseButton();
}
@Override
protected void postCreate() {
super.postCreate();
// This tells the controller to load the settings into the page UI.
mSettingsController.setSettingsPage(this);
}
@Override
protected void close() {
// Dissociate this page from the controller
mSettingsController.setSettingsPage(null);
super.close();
}
// -- Start of internal part ----------
// Hide everything down-below from SWT designer
//$hide>>$
/** Loads settings from the given {@link Properties} container and update the page UI. */
@Override
public void loadSettings(Properties inSettings) {
mTextProxyServer.setText(inSettings.getProperty(KEY_HTTP_PROXY_HOST, "")); //$NON-NLS-1$
mTextProxyPort.setText( inSettings.getProperty(KEY_HTTP_PROXY_PORT, "")); //$NON-NLS-1$
mCheckForceHttp.setSelection(
Boolean.parseBoolean(inSettings.getProperty(KEY_FORCE_HTTP)));
mCheckAskAdbRestart.setSelection(
Boolean.parseBoolean(inSettings.getProperty(KEY_ASK_ADB_RESTART)));
mCheckUseCache.setSelection(
Boolean.parseBoolean(inSettings.getProperty(KEY_USE_DOWNLOAD_CACHE)));
mCheckEnablePreviews.setSelection(
Boolean.parseBoolean(inSettings.getProperty(KEY_ENABLE_PREVIEWS)));
}
/** Called by the application to retrieve settings from the UI and store them in
* the given {@link Properties} container. */
@Override
public void retrieveSettings(Properties outSettings) {
outSettings.setProperty(KEY_HTTP_PROXY_HOST, mTextProxyServer.getText());
outSettings.setProperty(KEY_HTTP_PROXY_PORT, mTextProxyPort.getText());
outSettings.setProperty(KEY_FORCE_HTTP,
Boolean.toString(mCheckForceHttp.getSelection()));
outSettings.setProperty(KEY_ASK_ADB_RESTART,
Boolean.toString(mCheckAskAdbRestart.getSelection()));
outSettings.setProperty(KEY_USE_DOWNLOAD_CACHE,
Boolean.toString(mCheckUseCache.getSelection()));
outSettings.setProperty(KEY_ENABLE_PREVIEWS,
Boolean.toString(mCheckEnablePreviews.getSelection()));
}
/**
* Called by the application to give a callback that the page should invoke when
* settings must be applied. The page does not apply the settings itself, instead
* it notifies the application.
*/
@Override
public void setOnSettingsChanged(SettingsChangedCallback settingsChangedCallback) {
mSettingsChangedCallback = settingsChangedCallback;
}
/**
* Callback invoked when user touches one of the settings.
* There is no "Apply" button, settings are applied immediately as they are changed.
* Notify the application that settings have changed.
*/
private void applyNewSettings() {
if (mSettingsChangedCallback != null) {
mSettingsChangedCallback.onSettingsChanged(this);
}
}
private void updateDownloadCacheSize() {
long size = mDownloadCache.getCurrentSize();
String str = FormatUtils.byteSizeToString(size);
mTextCacheSize.setText(str);
}
// End of hiding from SWT Designer
//$hide<<$
}