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