Home | History | Annotate | Download | only in preferences
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.ide.eclipse.adt.internal.preferences;
     18 
     19 
     20 import com.android.annotations.NonNull;
     21 import com.android.ide.common.xml.XmlAttributeSortOrder;
     22 import com.android.ide.eclipse.adt.AdtPlugin;
     23 import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
     24 import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderPreviewMode;
     25 import com.android.prefs.AndroidLocation.AndroidLocationException;
     26 import com.android.sdklib.internal.build.DebugKeyProvider;
     27 import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
     28 import com.android.sdkstats.DdmsPreferenceStore;
     29 
     30 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
     31 import org.eclipse.jface.preference.IPreferenceStore;
     32 import org.eclipse.jface.util.PropertyChangeEvent;
     33 
     34 import java.io.File;
     35 import java.util.Locale;
     36 
     37 public final class AdtPrefs extends AbstractPreferenceInitializer {
     38     public final static String PREFS_SDK_DIR = AdtPlugin.PLUGIN_ID + ".sdk"; //$NON-NLS-1$
     39 
     40     public final static String PREFS_BUILD_RES_AUTO_REFRESH = AdtPlugin.PLUGIN_ID + ".resAutoRefresh"; //$NON-NLS-1$
     41 
     42     public final static String PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR = AdtPlugin.PLUGIN_ID + ".forceErrorNativeLibInJar"; //$NON-NLS-1$
     43 
     44     public final static String PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE = AdtPlugin.PLUGIN_ID + ".skipPostCompileOnFileSave"; //$NON-NLS-1$
     45 
     46     public final static String PREFS_BUILD_VERBOSITY = AdtPlugin.PLUGIN_ID + ".buildVerbosity"; //$NON-NLS-1$
     47 
     48     public final static String PREFS_DEFAULT_DEBUG_KEYSTORE = AdtPlugin.PLUGIN_ID + ".defaultDebugKeyStore"; //$NON-NLS-1$
     49 
     50     public final static String PREFS_CUSTOM_DEBUG_KEYSTORE = AdtPlugin.PLUGIN_ID + ".customDebugKeyStore"; //$NON-NLS-1$
     51 
     52     public final static String PREFS_HOME_PACKAGE = AdtPlugin.PLUGIN_ID + ".homePackage"; //$NON-NLS-1$
     53 
     54     public final static String PREFS_EMU_OPTIONS = AdtPlugin.PLUGIN_ID + ".emuOptions"; //$NON-NLS-1$
     55 
     56     public final static String PREFS_MONITOR_DENSITY = AdtPlugin.PLUGIN_ID + ".monitorDensity"; //$NON-NLS-1$
     57 
     58     public final static String PREFS_FORMAT_GUI_XML = AdtPlugin.PLUGIN_ID + ".formatXml"; //$NON-NLS-1$
     59     public final static String PREFS_PREFER_XML = AdtPlugin.PLUGIN_ID + ".xmlEditor"; //$NON-NLS-1$
     60     public final static String PREFS_USE_CUSTOM_XML_FORMATTER = AdtPlugin.PLUGIN_ID + ".androidForm"; //$NON-NLS-1$
     61 
     62     public final static String PREFS_PALETTE_MODE = AdtPlugin.PLUGIN_ID + ".palette"; //$NON-NLS-1$
     63 
     64     public final static String PREFS_USE_ECLIPSE_INDENT = AdtPlugin.PLUGIN_ID + ".eclipseIndent"; //$NON-NLS-1$
     65     public final static String PREVS_REMOVE_EMPTY_LINES = AdtPlugin.PLUGIN_ID + ".removeEmpty"; //$NON-NLS-1$
     66     public final static String PREFS_ONE_ATTR_PER_LINE = AdtPlugin.PLUGIN_ID + ".oneAttrPerLine"; //$NON-NLS-1$
     67     public final static String PREFS_SPACE_BEFORE_CLOSE = AdtPlugin.PLUGIN_ID + ".spaceBeforeClose"; //$NON-NLS-1$
     68     public final static String PREFS_FORMAT_ON_SAVE = AdtPlugin.PLUGIN_ID + ".formatOnSave"; //$NON-NLS-1$
     69     public final static String PREFS_LINT_ON_SAVE = AdtPlugin.PLUGIN_ID + ".lintOnSave"; //$NON-NLS-1$
     70     public final static String PREFS_LINT_ON_EXPORT = AdtPlugin.PLUGIN_ID + ".lintOnExport"; //$NON-NLS-1$
     71     public final static String PREFS_ATTRIBUTE_SORT = AdtPlugin.PLUGIN_ID + ".attrSort"; //$NON-NLS-1$
     72     public final static String PREFS_LINT_SEVERITIES = AdtPlugin.PLUGIN_ID + ".lintSeverities"; //$NON-NLS-1$
     73     public final static String PREFS_FIX_LEGACY_EDITORS = AdtPlugin.PLUGIN_ID + ".fixLegacyEditors"; //$NON-NLS-1$
     74     public final static String PREFS_SHARED_LAYOUT_EDITOR = AdtPlugin.PLUGIN_ID + ".sharedLayoutEditor"; //$NON-NLS-1$
     75     public final static String PREFS_PREVIEWS = AdtPlugin.PLUGIN_ID + ".previews"; //$NON-NLS-1$
     76     public final static String PREFS_SKIP_LINT_LIBS = AdtPlugin.PLUGIN_ID + ".skipLintLibs"; //$NON-NLS-1$
     77     public final static String PREFS_AUTO_PICK_TARGET = AdtPlugin.PLUGIN_ID + ".autoPickTarget"; //$NON-NLS-1$
     78     public final static String PREFS_REFACTOR_IDS = AdtPlugin.PLUGIN_ID + ".refactorIds"; //$NON-NLS-1$
     79 
     80     /** singleton instance */
     81     private final static AdtPrefs sThis = new AdtPrefs();
     82 
     83     /** default store, provided by eclipse */
     84     private IPreferenceStore mStore;
     85 
     86     /** cached location for the sdk folder */
     87     private String mOsSdkLocation;
     88 
     89     /** Verbosity of the build */
     90     private BuildVerbosity mBuildVerbosity = BuildVerbosity.NORMAL;
     91 
     92     private boolean mBuildForceResResfresh = false;
     93     private boolean mBuildForceErrorOnNativeLibInJar = true;
     94     private boolean mBuildSkipPostCompileOnFileSave = true;
     95     private float mMonitorDensity = 0.f;
     96     private String mPalette;
     97 
     98     private boolean mFormatGuiXml;
     99     private boolean mCustomXmlFormatter;
    100     private boolean mUseEclipseIndent;
    101     private boolean mRemoveEmptyLines;
    102     private boolean mOneAttributeOnFirstLine;
    103     private boolean mSpaceBeforeClose;
    104     private boolean mFormatOnSave;
    105     private boolean mLintOnSave;
    106     private boolean mLintOnExport;
    107     private XmlAttributeSortOrder mAttributeSort;
    108     private boolean mSharedLayoutEditor;
    109     private boolean mAutoPickTarget;
    110     private RenderPreviewMode mPreviewMode = RenderPreviewMode.NONE;
    111     private int mPreferXmlEditor;
    112     private boolean mSkipLibrariesFromLint;
    113 
    114     public static enum BuildVerbosity {
    115         /** Build verbosity "Always". Those messages are always displayed, even in silent mode */
    116         ALWAYS(0),
    117         /** Build verbosity level "Normal" */
    118         NORMAL(1),
    119         /** Build verbosity level "Verbose". Those messages are only displayed in verbose mode */
    120         VERBOSE(2);
    121 
    122         private int mLevel;
    123 
    124         BuildVerbosity(int level) {
    125             mLevel = level;
    126         }
    127 
    128         public int getLevel() {
    129             return mLevel;
    130         }
    131 
    132         /**
    133          * Finds and returns a {@link BuildVerbosity} whose {@link #name()} matches a given name.
    134          * <p/>This is different from {@link Enum#valueOf(Class, String)} in that it returns null
    135          * if no matches are found.
    136          *
    137          * @param name the name to look up.
    138          * @return returns the matching enum or null of no match where found.
    139          */
    140         public static BuildVerbosity find(String name) {
    141             for (BuildVerbosity v : values()) {
    142                 if (v.name().equals(name)) {
    143                     return v;
    144                 }
    145             }
    146 
    147             return null;
    148         }
    149     }
    150 
    151     public static void init(IPreferenceStore preferenceStore) {
    152         sThis.mStore = preferenceStore;
    153     }
    154 
    155     public static AdtPrefs getPrefs() {
    156         return sThis;
    157     }
    158 
    159     public synchronized void loadValues(PropertyChangeEvent event) {
    160         // get the name of the property that changed, if any
    161         String property = event != null ? event.getProperty() : null;
    162 
    163         if (property == null || PREFS_SDK_DIR.equals(property)) {
    164             mOsSdkLocation = mStore.getString(PREFS_SDK_DIR);
    165 
    166             // Make it possible to override the SDK path using an environment variable.
    167             // The value will only be used if it matches an existing directory.
    168             // Useful for testing from Eclipse.
    169             // Note: this is a hack that does not change the preferences, so if the user
    170             // looks at Window > Preferences > Android, the path will be the preferences
    171             // one and not the overridden one.
    172             String override = System.getenv("ADT_TEST_SDK_PATH");   //$NON-NLS-1$
    173             if (override != null && override.length() > 0 && new File(override).isDirectory()) {
    174                 mOsSdkLocation = override;
    175             }
    176 
    177             // make sure it ends with a separator. Normally this is done when the preference
    178             // is set. But to make sure older version still work, we fix it here as well.
    179             if (mOsSdkLocation.length() > 0 && mOsSdkLocation.endsWith(File.separator) == false) {
    180                 mOsSdkLocation = mOsSdkLocation + File.separator;
    181             }
    182         }
    183 
    184         if (property == null || PREFS_BUILD_VERBOSITY.equals(property)) {
    185             mBuildVerbosity = BuildVerbosity.find(mStore.getString(PREFS_BUILD_VERBOSITY));
    186             if (mBuildVerbosity == null) {
    187                 mBuildVerbosity = BuildVerbosity.NORMAL;
    188             }
    189         }
    190 
    191         if (property == null || PREFS_BUILD_RES_AUTO_REFRESH.equals(property)) {
    192             mBuildForceResResfresh = mStore.getBoolean(PREFS_BUILD_RES_AUTO_REFRESH);
    193         }
    194 
    195         if (property == null || PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR.equals(property)) {
    196             mBuildForceErrorOnNativeLibInJar =
    197                     mStore.getBoolean(PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR);
    198         }
    199 
    200         if (property == null || PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE.equals(property)) {
    201             mBuildSkipPostCompileOnFileSave =
    202                 mStore.getBoolean(PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE);
    203         }
    204 
    205         if (property == null || PREFS_MONITOR_DENSITY.equals(property)) {
    206             mMonitorDensity = mStore.getFloat(PREFS_MONITOR_DENSITY);
    207         }
    208 
    209         if (property == null || PREFS_FORMAT_GUI_XML.equals(property)) {
    210             mFormatGuiXml = mStore.getBoolean(PREFS_FORMAT_GUI_XML);
    211         }
    212 
    213         if (property == null || PREFS_PREFER_XML.equals(property)) {
    214             mPreferXmlEditor = mStore.getInt(PREFS_PREFER_XML);
    215         }
    216 
    217         if (property == null || PREFS_USE_CUSTOM_XML_FORMATTER.equals(property)) {
    218             mCustomXmlFormatter = mStore.getBoolean(PREFS_USE_CUSTOM_XML_FORMATTER);
    219         }
    220 
    221         if (property == null || PREFS_PALETTE_MODE.equals(property)) {
    222             mPalette = mStore.getString(PREFS_PALETTE_MODE);
    223         }
    224 
    225         if (property == null || PREFS_USE_ECLIPSE_INDENT.equals(property)) {
    226             mUseEclipseIndent = mStore.getBoolean(PREFS_USE_ECLIPSE_INDENT);
    227         }
    228 
    229         if (property == null || PREVS_REMOVE_EMPTY_LINES.equals(property)) {
    230             mRemoveEmptyLines = mStore.getBoolean(PREVS_REMOVE_EMPTY_LINES);
    231         }
    232 
    233         if (property == null || PREFS_ONE_ATTR_PER_LINE.equals(property)) {
    234             mOneAttributeOnFirstLine = mStore.getBoolean(PREFS_ONE_ATTR_PER_LINE);
    235         }
    236 
    237         if (property == null || PREFS_ATTRIBUTE_SORT.equals(property)) {
    238             String order = mStore.getString(PREFS_ATTRIBUTE_SORT);
    239             mAttributeSort = XmlAttributeSortOrder.LOGICAL;
    240             if (XmlAttributeSortOrder.ALPHABETICAL.key.equals(order)) {
    241                 mAttributeSort = XmlAttributeSortOrder.ALPHABETICAL;
    242             } else if (XmlAttributeSortOrder.NO_SORTING.key.equals(order)) {
    243                 mAttributeSort = XmlAttributeSortOrder.NO_SORTING;
    244             }
    245         }
    246 
    247         if (property == null || PREFS_SPACE_BEFORE_CLOSE.equals(property)) {
    248             mSpaceBeforeClose = mStore.getBoolean(PREFS_SPACE_BEFORE_CLOSE);
    249         }
    250 
    251         if (property == null || PREFS_FORMAT_ON_SAVE.equals(property)) {
    252             mFormatOnSave = mStore.getBoolean(PREFS_FORMAT_ON_SAVE);
    253         }
    254 
    255         if (property == null || PREFS_LINT_ON_SAVE.equals(property)) {
    256             mLintOnSave = mStore.getBoolean(PREFS_LINT_ON_SAVE);
    257         }
    258 
    259         if (property == null || PREFS_LINT_ON_EXPORT.equals(property)) {
    260             mLintOnExport = mStore.getBoolean(PREFS_LINT_ON_EXPORT);
    261         }
    262 
    263         if (property == null || PREFS_SHARED_LAYOUT_EDITOR.equals(property)) {
    264             mSharedLayoutEditor = mStore.getBoolean(PREFS_SHARED_LAYOUT_EDITOR);
    265         }
    266 
    267         if (property == null || PREFS_AUTO_PICK_TARGET.equals(property)) {
    268             mAutoPickTarget = mStore.getBoolean(PREFS_AUTO_PICK_TARGET);
    269         }
    270 
    271         if (property == null || PREFS_PREVIEWS.equals(property)) {
    272             mPreviewMode = RenderPreviewMode.NONE;
    273             String previewMode = mStore.getString(PREFS_PREVIEWS);
    274             if (previewMode != null && !previewMode.isEmpty()) {
    275                 try {
    276                     mPreviewMode = RenderPreviewMode.valueOf(previewMode.toUpperCase(Locale.US));
    277                 } catch (IllegalArgumentException iae) {
    278                     // Ignore: Leave it as RenderPreviewMode.NONE
    279                 }
    280             }
    281         }
    282 
    283         if (property == null || PREFS_SKIP_LINT_LIBS.equals(property)) {
    284             mSkipLibrariesFromLint = mStore.getBoolean(PREFS_SKIP_LINT_LIBS);
    285         }
    286     }
    287 
    288     /**
    289      * Returns the SDK folder.
    290      * Guaranteed to be terminated by a platform-specific path separator.
    291      */
    292     public synchronized String getOsSdkFolder() {
    293         return mOsSdkLocation;
    294     }
    295 
    296     public synchronized BuildVerbosity getBuildVerbosity() {
    297         return mBuildVerbosity;
    298     }
    299 
    300     public boolean getBuildForceResResfresh() {
    301         return mBuildForceResResfresh;
    302     }
    303 
    304     /**
    305      * Should changes made by GUI editors automatically format the corresponding XML nodes
    306      * affected by the edit?
    307      *
    308      * @return true if the GUI editors should format affected XML regions
    309      */
    310     public boolean getFormatGuiXml() {
    311         // The format-GUI-editors flag only applies when the custom formatter is used,
    312         // since the built-in formatter has problems editing partial documents
    313         return mFormatGuiXml && mCustomXmlFormatter;
    314     }
    315 
    316     /**
    317      * Should the XML formatter use a custom Android XML formatter (following
    318      * Android code style) or use the builtin Eclipse XML formatter?
    319      *
    320      * @return true if the Android formatter should be used instead of the
    321      *         default Eclipse one
    322      */
    323     public boolean getUseCustomXmlFormatter() {
    324         return mCustomXmlFormatter;
    325     }
    326 
    327     /**
    328      * Should the Android XML formatter use the Eclipse XML indentation settings
    329      * (usually one tab character) instead of the default 4 space character
    330      * indent?
    331      *
    332      * @return true if the Eclipse XML indentation settings should be use
    333      */
    334     public boolean isUseEclipseIndent() {
    335         return mUseEclipseIndent;
    336     }
    337 
    338     /**
    339      * Should the Android XML formatter try to avoid inserting blank lines to
    340      * make the format as compact as possible (no blank lines between elements,
    341      * no blank lines surrounding comments, etc).
    342      *
    343      * @return true to remove blank lines
    344      */
    345     public boolean isRemoveEmptyLines() {
    346         return mRemoveEmptyLines;
    347     }
    348 
    349     /**
    350      * Should the Android XML formatter attempt to place a single attribute on
    351      * the same line as the element open tag?
    352      *
    353      * @return true if single-attribute elements should place the attribute on
    354      *         the same line as the element open tag
    355      */
    356     public boolean isOneAttributeOnFirstLine() {
    357         return mOneAttributeOnFirstLine;
    358     }
    359 
    360     /**
    361      * Returns the sort order to be applied to the attributes (one of which can
    362      * be {@link com.android.ide.common.xml.XmlAttributeSortOrder#NO_SORTING}).
    363      *
    364      * @return the sort order to apply to the attributes
    365      */
    366     public XmlAttributeSortOrder getAttributeSort() {
    367         if (mAttributeSort == null) {
    368             return XmlAttributeSortOrder.LOGICAL;
    369         }
    370         return mAttributeSort;
    371     }
    372 
    373     /**
    374      * Returns whether a space should be inserted before the closing {@code >}
    375      * character in open tags and before the closing {@code />} characters in
    376      * empty tag. Note that the {@link com.android.ide.common.xml.XmlFormatStyle#RESOURCE} style overrides
    377      * this setting to make it more compact for the {@code <item>} elements.
    378      *
    379      * @return true if an empty space should be inserted before {@code >} or
    380      *         {@code />}.
    381      */
    382     public boolean isSpaceBeforeClose() {
    383         return mSpaceBeforeClose;
    384     }
    385 
    386     /**
    387      * Returns whether the file should be automatically formatted on save.
    388      *
    389      * @return true if the XML files should be formatted on save.
    390      */
    391     public boolean isFormatOnSave() {
    392         return mFormatOnSave;
    393     }
    394 
    395     public boolean isLintOnSave() {
    396         return mLintOnSave;
    397     }
    398 
    399     public void setLintOnSave(boolean on) {
    400         mLintOnSave = on;
    401         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    402         store.setValue(PREFS_LINT_ON_SAVE, on);
    403     }
    404 
    405     public boolean isLintOnExport() {
    406         return mLintOnExport;
    407     }
    408 
    409     public void setLintOnExport(boolean on) {
    410         mLintOnExport = on;
    411         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    412         store.setValue(PREFS_LINT_ON_EXPORT, on);
    413     }
    414 
    415     /**
    416      * Returns whether the layout editor is sharing a single editor for all variations
    417      * of a single resource. The default is false.
    418      *
    419      * @return true if the editor should be shared
    420      */
    421     public boolean isSharedLayoutEditor() {
    422         return mSharedLayoutEditor;
    423     }
    424 
    425     /**
    426      * Sets whether the layout editor should share a single editor for all variations
    427      * of a single resource
    428      *
    429      * @param on if true, use a single editor
    430      */
    431     public void setSharedLayoutEditor(boolean on) {
    432         mSharedLayoutEditor = on;
    433         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    434         store.setValue(PREFS_SHARED_LAYOUT_EDITOR, on);
    435 
    436         // TODO: If enabling a shared editor, go and close all editors that are aliasing
    437         // the same resource except for one of them.
    438     }
    439 
    440 
    441     public boolean getBuildForceErrorOnNativeLibInJar() {
    442         return mBuildForceErrorOnNativeLibInJar;
    443     }
    444 
    445     public boolean getBuildSkipPostCompileOnFileSave() {
    446         return mBuildSkipPostCompileOnFileSave;
    447     }
    448 
    449     public String getPaletteModes() {
    450         return mPalette;
    451     }
    452 
    453     public void setPaletteModes(String palette) {
    454         mPalette = palette;
    455 
    456         // need to save this new value to the store
    457         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    458         store.setValue(PREFS_PALETTE_MODE, palette);
    459     }
    460 
    461     public float getMonitorDensity() {
    462         return mMonitorDensity;
    463     }
    464 
    465     public void setMonitorDensity(float density) {
    466         mMonitorDensity = density;
    467 
    468         // need to save this new value to the store
    469         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    470         store.setValue(PREFS_MONITOR_DENSITY, density);
    471     }
    472 
    473     /**
    474      * Sets the new location of the SDK
    475      *
    476      * @param location the location of the SDK
    477      */
    478     public void setSdkLocation(File location) {
    479         mOsSdkLocation = location != null ? location.getPath() : null;
    480 
    481         // TODO: Also store this location in the .android settings directory
    482         // such that we can support using multiple workspaces without asking
    483         // over and over.
    484         if (mOsSdkLocation != null && mOsSdkLocation.length() > 0) {
    485             DdmsPreferenceStore ddmsStore = new DdmsPreferenceStore();
    486             ddmsStore.setLastSdkPath(mOsSdkLocation);
    487         }
    488 
    489         // need to save this new value to the store
    490         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    491         store.setValue(PREFS_SDK_DIR, mOsSdkLocation);
    492     }
    493 
    494     @Override
    495     public void initializeDefaultPreferences() {
    496         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    497         initializeStoreWithDefaults(store);
    498     }
    499 
    500     public void initializeStoreWithDefaults(IPreferenceStore store) {
    501         store.setDefault(PREFS_BUILD_RES_AUTO_REFRESH, true);
    502         store.setDefault(PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR, true);
    503         store.setDefault(PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE, true);
    504 
    505         store.setDefault(PREFS_BUILD_VERBOSITY, BuildVerbosity.ALWAYS.name());
    506 
    507         store.setDefault(PREFS_HOME_PACKAGE, "android.process.acore"); //$NON-NLS-1$
    508 
    509         store.setDefault(PREFS_MONITOR_DENSITY, 0.f);
    510 
    511         store.setDefault(PREFS_FORMAT_GUI_XML, true);
    512         store.setDefault(PREFS_USE_CUSTOM_XML_FORMATTER, true);
    513         store.setDefault(PREFS_ONE_ATTR_PER_LINE, true);
    514         store.setDefault(PREFS_SPACE_BEFORE_CLOSE, true);
    515         store.setDefault(PREFS_LINT_ON_SAVE, true);
    516         store.setDefault(PREFS_LINT_ON_EXPORT, true);
    517         store.setDefault(PREFS_AUTO_PICK_TARGET, true);
    518 
    519         // Defaults already handled; no need to write into map:
    520         //store.setDefault(PREFS_ATTRIBUTE_SORT, XmlAttributeSortOrder.LOGICAL.key);
    521         //store.setDefault(PREFS_USE_ECLIPSE_INDENT, false);
    522         //store.setDefault(PREVS_REMOVE_EMPTY_LINES, false);
    523         //store.setDefault(PREFS_FORMAT_ON_SAVE, false);
    524         //store.setDefault(PREFS_SHARED_LAYOUT_EDITOR, false);
    525         //store.setDefault(PREFS_SKIP_LINT_LIBS, false);
    526 
    527         try {
    528             store.setDefault(PREFS_DEFAULT_DEBUG_KEYSTORE,
    529                     DebugKeyProvider.getDefaultKeyStoreOsPath());
    530         } catch (KeytoolException e) {
    531             AdtPlugin.log(e, "Get default debug keystore path failed"); //$NON-NLS-1$
    532         } catch (AndroidLocationException e) {
    533             AdtPlugin.log(e, "Get default debug keystore path failed"); //$NON-NLS-1$
    534         }
    535     }
    536 
    537     /**
    538      * Returns whether the most recent page switch was to XML
    539      *
    540      * @param editorType the editor to check a preference for; corresponds to
    541      *            one of the persistence class ids returned by
    542      *            {@link AndroidXmlEditor#getPersistenceCategory}
    543      * @return whether the most recent page switch in the given editor was to
    544      *         XML
    545      */
    546     public boolean isXmlEditorPreferred(int editorType) {
    547         return (mPreferXmlEditor & editorType) != 0;
    548     }
    549 
    550     /**
    551      * Set whether the most recent page switch for a given editor type was to
    552      * XML
    553      *
    554      * @param editorType the editor to check a preference for; corresponds to
    555      *            one of the persistence class ids returned by
    556      *            {@link AndroidXmlEditor#getPersistenceCategory}
    557      * @param xml whether the last manual page switch in the given editor type
    558      *            was to XML
    559      */
    560     public void setXmlEditorPreferred(int editorType, boolean xml) {
    561         if (xml != isXmlEditorPreferred(editorType)) {
    562             if (xml) {
    563                 mPreferXmlEditor |= editorType;
    564             } else {
    565                 mPreferXmlEditor &= ~editorType;
    566             }
    567             assert ((mPreferXmlEditor & editorType) != 0) == xml;
    568             IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    569             store.setValue(PREFS_PREFER_XML, xml);
    570         }
    571     }
    572 
    573     /**
    574      * Gets the {@link RenderPreviewMode}
    575      *
    576      * @return the preview mode
    577      */
    578     @NonNull
    579     public RenderPreviewMode getRenderPreviewMode() {
    580         return mPreviewMode;
    581     }
    582 
    583     /**
    584      * Sets the {@link RenderPreviewMode}
    585      *
    586      * @param previewMode the preview mode
    587      */
    588     public void setPreviewMode(@NonNull RenderPreviewMode previewMode) {
    589         mPreviewMode = previewMode;
    590         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    591         if (previewMode != RenderPreviewMode.NONE) {
    592             store.setValue(PREFS_PREVIEWS, previewMode.name().toLowerCase(Locale.US));
    593         } else {
    594             store.setToDefault(PREFS_PREVIEWS);
    595         }
    596     }
    597 
    598     /**
    599      * Sets whether auto-pick render target mode is enabled.
    600      *
    601      * @return whether the layout editor should automatically pick the best render target
    602      */
    603     public boolean isAutoPickRenderTarget() {
    604         return mAutoPickTarget;
    605     }
    606 
    607     /**
    608      * Sets whether auto-pick render target mode is enabled.
    609      *
    610      * @param autoPick if true, auto pick the best render target in the layout editor
    611      */
    612     public void setAutoPickRenderTarget(boolean autoPick) {
    613         mAutoPickTarget = autoPick;
    614         IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    615         if (autoPick) {
    616             store.setToDefault(PREFS_AUTO_PICK_TARGET);
    617         } else {
    618             store.setValue(PREFS_AUTO_PICK_TARGET, autoPick);
    619         }
    620     }
    621 
    622     /**
    623      * Sets whether libraries should be excluded when running lint on a project
    624      *
    625      * @param exclude if true, exclude library projects
    626      */
    627     public void setSkipLibrariesFromLint(boolean exclude) {
    628         if (exclude != mSkipLibrariesFromLint) {
    629             mSkipLibrariesFromLint = exclude;
    630             IPreferenceStore store = AdtPlugin.getDefault().getPreferenceStore();
    631             if (exclude) {
    632                 store.setValue(PREFS_SKIP_LINT_LIBS, true);
    633             } else {
    634                 store.setToDefault(PREFS_SKIP_LINT_LIBS);
    635             }
    636         }
    637     }
    638 
    639     /**
    640      * Returns whether libraries should be excluded when running lint on a project
    641      *
    642      * @return if true, exclude library projects
    643      */
    644     public boolean getSkipLibrariesFromLint() {
    645         return mSkipLibrariesFromLint;
    646     }
    647 }
    648