155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Eclipse Public License, Version 1.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.eclipse.org/org/documents/epl-v10.php
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1785211cd176c655f245e46b753926089adaf2a6fdXavier Ducrohetpackage com.android.ide.eclipse.adt.internal.preferences;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ide.eclipse.adt.AdtPlugin;
20b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohetimport com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.prefs.AndroidLocation.AndroidLocationException;
2210e712627b86b2b0061dbd3a20f5f966b2cd7330Xavier Ducrohetimport com.android.sdklib.internal.build.DebugKeyProvider;
2310e712627b86b2b0061dbd3a20f5f966b2cd7330Xavier Ducrohetimport com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.BooleanFieldEditor;
2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.FieldEditorPreferencePage;
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.FileFieldEditor;
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.RadioGroupFieldEditor;
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.StringFieldEditor;
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Composite;
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Text;
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.IWorkbench;
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.ui.IWorkbenchPreferencePage;
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.io.File;
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.io.IOException;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.security.GeneralSecurityException;
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.security.PrivateKey;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.security.cert.X509Certificate;
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.Date;
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/**
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Preference page for build options.
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpublic class BuildPreferencePage extends FieldEditorPreferencePage implements
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IWorkbenchPreferencePage {
4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public BuildPreferencePage() {
5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        super(GRID);
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        setPreferenceStore(AdtPlugin.getDefault().getPreferenceStore());
5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        setDescription(Messages.BuildPreferencePage_Title);
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
5655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    protected void createFieldEditors() {
57b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet        addField(new BooleanFieldEditor(AdtPrefs.PREFS_BUILD_RES_AUTO_REFRESH,
5855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Messages.BuildPreferencePage_Auto_Refresh_Resources_on_Build,
5955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                getFieldEditorParent()));
6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
61605d61926160af815b113fb98434f3e32cf7d73fXavier Ducrohet        addField(new BooleanFieldEditor(AdtPrefs.PREFS_BUILD_FORCE_ERROR_ON_NATIVELIB_IN_JAR,
62b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                "Force error when external jars contain native libraries",
63b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                getFieldEditorParent()));
64b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
65acdf7441b5422a4a8949cd60e1f746f47e8078ffJosiah Gaskin        addField(new BooleanFieldEditor(AdtPrefs.PREFS_BUILD_SKIP_POST_COMPILE_ON_FILE_SAVE,
66acdf7441b5422a4a8949cd60e1f746f47e8078ffJosiah Gaskin                "Skip packaging and dexing until export or launch. (Speeds up automatic builds on file save)",
67acdf7441b5422a4a8949cd60e1f746f47e8078ffJosiah Gaskin                getFieldEditorParent()));
68acdf7441b5422a4a8949cd60e1f746f47e8078ffJosiah Gaskin
6955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        RadioGroupFieldEditor rgfe = new RadioGroupFieldEditor(
70b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                AdtPrefs.PREFS_BUILD_VERBOSITY,
7155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Messages.BuildPreferencePage_Build_Output, 1, new String[][] {
72b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                    { Messages.BuildPreferencePage_Silent, BuildVerbosity.ALWAYS.name() },
73b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                    { Messages.BuildPreferencePage_Normal, BuildVerbosity.NORMAL.name() },
74b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet                    { Messages.BuildPreferencePage_Verbose, BuildVerbosity.VERBOSE.name() }
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    },
7655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                getFieldEditorParent(), true);
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        addField(rgfe);
7855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
79b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet        addField(new ReadOnlyFieldEditor(AdtPrefs.PREFS_DEFAULT_DEBUG_KEYSTORE,
8055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Messages.BuildPreferencePage_Default_KeyStore, getFieldEditorParent()));
8155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
82b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet        addField(new KeystoreFieldEditor(AdtPrefs.PREFS_CUSTOM_DEBUG_KEYSTORE,
8355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Messages.BuildPreferencePage_Custom_Keystore, getFieldEditorParent()));
8455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
8655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
8855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * (non-Javadoc)
8955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     *
9055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
9155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
92ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye    @Override
9355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void init(IWorkbench workbench) {
9455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
9555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
9755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * A read-only string field editor.
9855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
9955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static class ReadOnlyFieldEditor extends StringFieldEditor {
10055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public ReadOnlyFieldEditor(String name, String labelText, Composite parent) {
10255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            super(name, labelText, parent);
10355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
10455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
10655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        protected void createControl(Composite parent) {
10755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            super.createControl(parent);
108b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
10955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            Text control = getTextControl();
11055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            control.setEditable(false);
11155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
11255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
113b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
11455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
11555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Custom {@link FileFieldEditor} that checks that the keystore is valid.
11655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
11755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static class KeystoreFieldEditor extends FileFieldEditor {
11855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public KeystoreFieldEditor(String name, String label, Composite parent) {
11955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            super(name, label, parent);
12055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            setValidateStrategy(VALIDATE_ON_KEY_STROKE);
12155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
122b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
12355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
12455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        protected boolean checkState() {
12555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String fileName = getTextControl().getText();
12655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            fileName = fileName.trim();
127b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
12855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // empty values are considered ok.
12955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (fileName.length() > 0) {
13055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                File file = new File(fileName);
13155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (file.isFile()) {
13255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // attempt to load the debug key.
13355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    try {
13455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        DebugKeyProvider provider = new DebugKeyProvider(fileName,
13555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                null /* storeType */, null /* key gen output */);
13655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        PrivateKey key = provider.getDebugKey();
13755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        X509Certificate certificate = (X509Certificate)provider.getCertificate();
138b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
13955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (key == null || certificate == null) {
14055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            showErrorMessage("Unable to find debug key in keystore!");
14155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            return false;
14255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
143b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
14455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        Date today = new Date();
14555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (certificate.getNotAfter().compareTo(today) < 0) {
14655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            showErrorMessage("Certificate is expired!");
14755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            return false;
14855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
149b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
15055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (certificate.getNotBefore().compareTo(today) > 0) {
15155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            showErrorMessage("Certificate validity is in the future!");
15255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            return false;
15355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
15455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
15555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // we're good!
15655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        clearErrorMessage();
15755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        return true;
15855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } catch (GeneralSecurityException e) {
15955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        handleException(e);
16055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        return false;
16155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } catch (IOException e) {
16255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        handleException(e);
16355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        return false;
16455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } catch (KeytoolException e) {
16555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        handleException(e);
16655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        return false;
16755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } catch (AndroidLocationException e) {
16855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        handleException(e);
16955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        return false;
17055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
17155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
172b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
17355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } else {
17455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // file does not exist.
17555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    showErrorMessage("Not a valid keystore path.");
17655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    return false;  // Apply/OK must be disabled
17755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
17855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
17955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
18055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            clearErrorMessage();
18155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return true;
18255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
183b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
18455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
18555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public Text getTextControl(Composite parent) {
18655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            setValidateStrategy(VALIDATE_ON_KEY_STROKE);
18755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return super.getTextControl(parent);
18855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
18955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
19055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        /**
19155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         * Set the error message from a {@link Throwable}. If the exception has no message, try
19255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         * to get the message from the cause.
19355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         * @param t the Throwable.
19455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         */
19555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        private void handleException(Throwable t) {
19655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String msg = t.getMessage();
19755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (msg == null) {
19855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Throwable cause = t.getCause();
19955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (cause != null) {
20055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    handleException(cause);
20155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } else {
20255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    setErrorMessage("Uknown error when getting the debug key!");
20355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
204b26699c2e42ff60ce56a07e2550e42223c5cc361Xavier Ducrohet
20555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return;
20655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
20755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
20855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // valid text, display it.
20955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            showErrorMessage(msg);
21055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
21155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
21255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
213