/* * Copyright 2011 Kevin Gaudin * * 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 org.acra; import org.acra.annotation.ReportsCrashes; import org.acra.sender.HttpSender; import org.acra.sender.HttpSender.Method; import org.acra.sender.HttpSender.Type; import org.acra.util.DefaultHttpsSocketFactoryFactory; import org.acra.util.HttpsSocketFactoryFactory; import org.acra.util.ReflectionException; import org.acra.util.ReflectionHelper; import java.lang.annotation.Annotation; import java.security.KeyStore; import java.util.Arrays; import java.util.List; import java.util.Map; import static org.acra.ACRA.LOG_TAG; import static org.acra.ACRAConstants.*; /** * This class is to be used if you need to apply dynamic settings. This is * needed for example when using ACRA in an Android Library Project since ADT * v14 where resource ids are not final anymore and can't be passed as * annotation parameters values. */ public class ACRAConfiguration implements ReportsCrashes { private final ReflectionHelper reflectionHelper = new ReflectionHelper(); private String[] mAdditionalDropboxTags = null; private String[] mAdditionalSharedPreferences = null; private Integer mConnectionTimeout = null; private ReportField[] mCustomReportContent = null; private Boolean mDeleteUnapprovedReportsOnApplicationStart = null; private Boolean mDeleteOldUnsentReportsOnApplicationStart = null; private Integer mDropboxCollectionMinutes = null; private Boolean mForceCloseDialogAfterToast = null; private String mFormUri = null; private String mFormUriBasicAuthLogin = null; private String mFormUriBasicAuthPassword = null; private Boolean mIncludeDropboxSystemTags = null; private String[] mLogcatArguments = null; private String mMailTo = null; private Integer mMaxNumberOfRequestRetries = null; private ReportingInteractionMode mMode = null; private ReportsCrashes mReportsCrashes = null; private Class<? extends BaseCrashReportDialog> mReportDialogClass = null; private Integer mResDialogPositiveButtonText = null; private Integer mResDialogNegativeButtonText = null; private Integer mResDialogCommentPrompt = null; private Integer mResDialogEmailPrompt = null; private Integer mResDialogIcon = null; private Integer mResDialogOkToast = null; private Integer mResDialogText = null; private Integer mResDialogTitle = null; private Integer mResNotifIcon = null; private Integer mResNotifText = null; private Integer mResNotifTickerText = null; private Integer mResNotifTitle = null; private Integer mResToastText = null; private Integer mSharedPreferenceMode = null; private String mSharedPreferenceName = null; private Integer mSocketTimeout = null; private Boolean mLogcatFilterByPid = null; private Boolean mSendReportsInDevMode = null; private Boolean mSendReportsAtShutdown = null; private String[] mExcludeMatchingSharedPreferencesKeys = null; private String[] mExcludeMatchingSettingsKeys = null; private Class mBuildConfigClass; private String mApplicationLogFile = null; private Integer mApplicationLogFileLines = null; private Boolean mDisableSSLCertValidation = null; private String mHttpsSocketFactoryFactoryClass = null; private HttpsSocketFactoryFactory mHttpsSocketFactoryFactory; private Method mHttpMethod = null; private Type mReportType = null; private Map<String, String> mHttpHeaders; private KeyStore mKeyStore; /** * Set custom HTTP headers to be sent by the provided {@link HttpSender}. * This should be used also by third party senders. * * @param headers * A map associating HTTP header names to their values. * @return The updated ACRA configuration */ public ACRAConfiguration setHttpHeaders(Map<String, String> headers) { this.mHttpHeaders = headers; return this; } /** * Retrieve HTTP headers defined by the application developer. These should * be added to requests sent by any third-party sender (over HTTP of * course). * * @return A map associating http header names to their values. */ public Map<String, String> getHttpHeaders() { return mHttpHeaders; } /** * @return List of ReportField that ACRA will provide to the server. */ public List<ReportField> getReportFields() { final ReportField[] customReportFields = customReportContent(); final ReportField[] fieldsList; if (customReportFields.length != 0) { ACRA.log.d(LOG_TAG, "Using custom Report Fields"); fieldsList = customReportFields; } else if (mailTo() == null || "".equals(mailTo())) { ACRA.log.d(LOG_TAG, "Using default Report Fields"); fieldsList = ACRAConstants.DEFAULT_REPORT_FIELDS; } else { ACRA.log.d(LOG_TAG, "Using default Mail Report Fields"); fieldsList = ACRAConstants.DEFAULT_MAIL_REPORT_FIELDS; } return Arrays.asList(fieldsList); } /** * @param additionalDropboxTags * the additionalDropboxTags to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setAdditionalDropboxTags(String[] additionalDropboxTags) { this.mAdditionalDropboxTags = additionalDropboxTags; return this; } /** * @param additionalSharedPreferences * the additionalSharedPreferences to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setAdditionalSharedPreferences(String[] additionalSharedPreferences) { this.mAdditionalSharedPreferences = additionalSharedPreferences; return this; } /** * @param connectionTimeout * the connectionTimeout to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setConnectionTimeout(Integer connectionTimeout) { this.mConnectionTimeout = connectionTimeout; return this; } /** * @param customReportContent * the customReportContent to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setCustomReportContent(ReportField[] customReportContent) { this.mCustomReportContent = customReportContent; return this; } /** * @param deleteUnapprovedReportsOnApplicationStart * the deleteUnapprovedReportsOnApplicationStart to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setDeleteUnapprovedReportsOnApplicationStart(Boolean deleteUnapprovedReportsOnApplicationStart) { this.mDeleteUnapprovedReportsOnApplicationStart = deleteUnapprovedReportsOnApplicationStart; return this; } /** * @param deleteOldUnsentReportsOnApplicationStart When to delete old (unsent) reports on startup. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setDeleteOldUnsentReportsOnApplicationStart(Boolean deleteOldUnsentReportsOnApplicationStart) { this.mDeleteOldUnsentReportsOnApplicationStart = deleteOldUnsentReportsOnApplicationStart; return this; } /** * @param dropboxCollectionMinutes * the dropboxCollectionMinutes to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setDropboxCollectionMinutes(Integer dropboxCollectionMinutes) { this.mDropboxCollectionMinutes = dropboxCollectionMinutes; return this; } /** * @param forceCloseDialogAfterToast * the forceCloseDialogAfterToast to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setForceCloseDialogAfterToast(Boolean forceCloseDialogAfterToast) { this.mForceCloseDialogAfterToast = forceCloseDialogAfterToast; return this; } /** * Modify the formUri of your backend server receiving reports. You need to * call {@link ErrorReporter#setDefaultReportSenders()} after modifying this * value if you were not using a formUri before (a mailTo or formKey * instead). * * @param formUri * the formUri to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setFormUri(String formUri) { this.mFormUri = formUri; return this; } /** * @param formUriBasicAuthLogin * the formUriBasicAuthLogin to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setFormUriBasicAuthLogin(String formUriBasicAuthLogin) { this.mFormUriBasicAuthLogin = formUriBasicAuthLogin; return this; } /** * @param formUriBasicAuthPassword * the formUriBasicAuthPassword to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setFormUriBasicAuthPassword(String formUriBasicAuthPassword) { this.mFormUriBasicAuthPassword = formUriBasicAuthPassword; return this; } /** * @param includeDropboxSystemTags * the includeDropboxSystemTags to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setIncludeDropboxSystemTags(Boolean includeDropboxSystemTags) { this.mIncludeDropboxSystemTags = includeDropboxSystemTags; return this; } /** * @param logcatArguments * the logcatArguments to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setLogcatArguments(String[] logcatArguments) { this.mLogcatArguments = logcatArguments; return this; } /** * Modify the mailTo of the mail account receiving reports. You need to call * {@link ErrorReporter#setDefaultReportSenders()} after modifying this * value if you were not using a formKey before (a formKey or formUri * instead). * * @param mailTo * the mailTo to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setMailTo(String mailTo) { this.mMailTo = mailTo; return this; } /** * @param maxNumberOfRequestRetries * the maxNumberOfRequestRetries to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setMaxNumberOfRequestRetries(Integer maxNumberOfRequestRetries) { this.mMaxNumberOfRequestRetries = maxNumberOfRequestRetries; return this; } /** * Change the current {@link ReportingInteractionMode}. You must set * required configuration items first. * * @param mode * the new mode to set. * @return The updated ACRA configuration * @throws ACRAConfigurationException * if a configuration item is missing for this mode. */ @SuppressWarnings( "unused" ) public ACRAConfiguration setMode(ReportingInteractionMode mode) throws ACRAConfigurationException { this.mMode = mode; ACRA.checkCrashResources(this); return this; } @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogPositiveButtonText(int resId) { mResDialogPositiveButtonText = resId; return this; } @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogNegativeButtonText(int resId) { mResDialogNegativeButtonText = resId; return this; } @SuppressWarnings( "unused" ) public ACRAConfiguration setReportDialogClass(Class<? extends BaseCrashReportDialog> reportDialogClass) { mReportDialogClass = reportDialogClass; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resDialogCommentPrompt()} comes from an Android * Library Project. * * @param resId * The resource id, see * {@link ReportsCrashes#resDialogCommentPrompt()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogCommentPrompt(int resId) { mResDialogCommentPrompt = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resDialogEmailPrompt()} comes from an Android * Library Project. * * @param resId * The resource id, see * {@link ReportsCrashes#resDialogEmailPrompt()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogEmailPrompt(int resId) { mResDialogEmailPrompt = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resDialogIcon()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resDialogIcon()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogIcon(int resId) { mResDialogIcon = resId; return this; } /** * Use this method BEFORE if the id you wanted to give to * {@link ReportsCrashes#resDialogOkToast()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resDialogOkToast()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogOkToast(int resId) { mResDialogOkToast = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resDialogText()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resDialogText()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogText(int resId) { mResDialogText = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resDialogTitle()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resDialogTitle()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResDialogTitle(int resId) { mResDialogTitle = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resNotifIcon()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resNotifIcon()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResNotifIcon(int resId) { mResNotifIcon = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resNotifText()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resNotifText()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResNotifText(int resId) { mResNotifText = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resNotifTickerText()} comes from an Android Library * Project. * * @param resId * The resource id, see * {@link ReportsCrashes#resNotifTickerText()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResNotifTickerText(int resId) { mResNotifTickerText = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resNotifTitle()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resNotifTitle()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResNotifTitle(int resId) { mResNotifTitle = resId; return this; } /** * Use this method if the id you wanted to give to * {@link ReportsCrashes#resToastText()} comes from an Android Library * Project. * * @param resId * The resource id, see {@link ReportsCrashes#resToastText()} * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setResToastText(int resId) { mResToastText = resId; return this; } /** * @param sharedPreferenceMode * the sharedPreferenceMode to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setSharedPreferenceMode(Integer sharedPreferenceMode) { this.mSharedPreferenceMode = sharedPreferenceMode; return this; } /** * @param sharedPreferenceName * the sharedPreferenceName to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setSharedPreferenceName(String sharedPreferenceName) { this.mSharedPreferenceName = sharedPreferenceName; return this; } /** * @param socketTimeout * the socketTimeout to set * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setSocketTimeout(Integer socketTimeout) { this.mSocketTimeout = socketTimeout; return this; } /** * * @param filterByPid * true if you want to collect only logcat lines related to your * application process. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setLogcatFilterByPid(Boolean filterByPid) { mLogcatFilterByPid = filterByPid; return this; } /** * * @param sendReportsInDevMode * false if you want to disable sending reports in development * mode. Reports will be sent only on signed applications. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setSendReportsInDevMode(Boolean sendReportsInDevMode) { mSendReportsInDevMode = sendReportsInDevMode; return this; } /** * * @param sendReportsAtShutdown * false if you want to disable sending reports at the time the * exception is caught. Reports will be sent when the application * is restarted. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setSendReportsAtShutdown(Boolean sendReportsAtShutdown) { mSendReportsAtShutdown = sendReportsAtShutdown; return this; } /** * * @param excludeMatchingSharedPreferencesKeys * an array of Strings containing regexp defining * SharedPreferences keys that should be excluded from the data * collection. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setExcludeMatchingSharedPreferencesKeys(String[] excludeMatchingSharedPreferencesKeys) { mExcludeMatchingSharedPreferencesKeys = excludeMatchingSharedPreferencesKeys; return this; } /** * * @param excludeMatchingSettingsKeys * an array of Strings containing regexp defining * Settings.System, Settings.Secure and Settings.Global keys that * should be excluded from the data collection. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setExcludeMatchingSettingsKeys(String[] excludeMatchingSettingsKeys) { mExcludeMatchingSettingsKeys = excludeMatchingSettingsKeys; return this; } @SuppressWarnings( "unused" ) public ACRAConfiguration setBuildConfigClass(Class buildConfigClass) { mBuildConfigClass = buildConfigClass; return this; } /** * * @param applicationLogFile * The path and file name of your application log file, to be * used with {@link ReportField#APPLICATION_LOG}. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setApplicationLogFile(String applicationLogFile) { mApplicationLogFile = applicationLogFile; return this; } /** * * @param applicationLogFileLines * The number of lines of your application log to be collected, * to be used with {@link ReportField#APPLICATION_LOG} and * {@link ReportsCrashes#applicationLogFile()}. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setApplicationLogFileLines(int applicationLogFileLines) { mApplicationLogFileLines = applicationLogFileLines; return this; } /** * * @param disableSSLCertValidation * Set this to true if you need to send reports to a server over * SSL using a self-signed certificate. * @return The updated ACRA configuration */ public ACRAConfiguration setDisableSSLCertValidation(boolean disableSSLCertValidation) { mDisableSSLCertValidation = disableSSLCertValidation; return this; } /** * * @param httpMethod * The method to be used to send data to the server. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setHttpMethod(Method httpMethod) { mHttpMethod = httpMethod; return this; } /** * * @param type * The type of content encoding to be used to send data to the * server. * @return The updated ACRA configuration */ @SuppressWarnings( "unused" ) public ACRAConfiguration setReportType(Type type) { mReportType = type; return this; } /** * * @param keyStore * Set this to the keystore that contains the trusted certificates */ @SuppressWarnings( "unused" ) public void setKeyStore(KeyStore keyStore) { mKeyStore = keyStore; } /** * @param defaults Defaults with which to initialise this {@link ACRAConfiguration}. */ public ACRAConfiguration(ReportsCrashes defaults) { mReportsCrashes = defaults; } /** * Empty constructor which sets no defaults. */ @SuppressWarnings( "unused" ) public ACRAConfiguration(){ this(null); } @Override public String[] additionalDropBoxTags() { if (mAdditionalDropboxTags != null) { return mAdditionalDropboxTags; } if (mReportsCrashes != null) { return mReportsCrashes.additionalDropBoxTags(); } return new String[0]; } @Override public String[] additionalSharedPreferences() { if (mAdditionalSharedPreferences != null) { return mAdditionalSharedPreferences; } if (mReportsCrashes != null) { return mReportsCrashes.additionalSharedPreferences(); } return new String[0]; } @Override public Class<? extends Annotation> annotationType() { return mReportsCrashes.annotationType(); } @Override public int connectionTimeout() { if (mConnectionTimeout != null) { return mConnectionTimeout; } if (mReportsCrashes != null) { return mReportsCrashes.connectionTimeout(); } return DEFAULT_CONNECTION_TIMEOUT; } @Override public ReportField[] customReportContent() { if (mCustomReportContent != null) { return mCustomReportContent; } if (mReportsCrashes != null) { return mReportsCrashes.customReportContent(); } return new ReportField[0]; } @Override public boolean deleteUnapprovedReportsOnApplicationStart() { if (mDeleteUnapprovedReportsOnApplicationStart != null) { return mDeleteUnapprovedReportsOnApplicationStart; } if (mReportsCrashes != null) { return mReportsCrashes.deleteUnapprovedReportsOnApplicationStart(); } return DEFAULT_DELETE_UNAPPROVED_REPORTS_ON_APPLICATION_START; } @Override public boolean deleteOldUnsentReportsOnApplicationStart() { if (mDeleteOldUnsentReportsOnApplicationStart != null) { return mDeleteOldUnsentReportsOnApplicationStart; } if (mReportsCrashes != null) { return mReportsCrashes.deleteOldUnsentReportsOnApplicationStart(); } return DEFAULT_DELETE_OLD_UNSENT_REPORTS_ON_APPLICATION_START; } @Override public int dropboxCollectionMinutes() { if (mDropboxCollectionMinutes != null) { return mDropboxCollectionMinutes; } if (mReportsCrashes != null) { return mReportsCrashes.dropboxCollectionMinutes(); } return DEFAULT_DROPBOX_COLLECTION_MINUTES; } @Override public boolean forceCloseDialogAfterToast() { if (mForceCloseDialogAfterToast != null) { return mForceCloseDialogAfterToast; } if (mReportsCrashes != null) { return mReportsCrashes.forceCloseDialogAfterToast(); } return DEFAULT_FORCE_CLOSE_DIALOG_AFTER_TOAST; } @Override public String formUri() { if (mFormUri != null) { return mFormUri; } if (mReportsCrashes != null) { return mReportsCrashes.formUri(); } return DEFAULT_STRING_VALUE; } @Override public String formUriBasicAuthLogin() { if (mFormUriBasicAuthLogin != null) { return mFormUriBasicAuthLogin; } if (mReportsCrashes != null) { return mReportsCrashes.formUriBasicAuthLogin(); } return NULL_VALUE; } @Override public String formUriBasicAuthPassword() { if (mFormUriBasicAuthPassword != null) { return mFormUriBasicAuthPassword; } if (mReportsCrashes != null) { return mReportsCrashes.formUriBasicAuthPassword(); } return NULL_VALUE; } @Override public boolean includeDropBoxSystemTags() { if (mIncludeDropboxSystemTags != null) { return mIncludeDropboxSystemTags; } if (mReportsCrashes != null) { return mReportsCrashes.includeDropBoxSystemTags(); } return DEFAULT_INCLUDE_DROPBOX_SYSTEM_TAGS; } @Override public String[] logcatArguments() { if (mLogcatArguments != null) { return mLogcatArguments; } if (mReportsCrashes != null) { return mReportsCrashes.logcatArguments(); } return new String[] { "-t", Integer.toString(DEFAULT_LOGCAT_LINES), "-v", "time" }; } @Override public String mailTo() { if (mMailTo != null) { return mMailTo; } if (mReportsCrashes != null) { return mReportsCrashes.mailTo(); } return DEFAULT_STRING_VALUE; } @Override public int maxNumberOfRequestRetries() { if (mMaxNumberOfRequestRetries != null) { return mMaxNumberOfRequestRetries; } if (mReportsCrashes != null) { return mReportsCrashes.maxNumberOfRequestRetries(); } return DEFAULT_MAX_NUMBER_OF_REQUEST_RETRIES; } @Override public ReportingInteractionMode mode() { if (mMode != null) { return mMode; } if (mReportsCrashes != null) { return mReportsCrashes.mode(); } return ReportingInteractionMode.SILENT; } @Override public int resDialogPositiveButtonText() { if (mResDialogPositiveButtonText != null) { return mResDialogPositiveButtonText; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogPositiveButtonText(); } return DEFAULT_RES_VALUE; } @Override public int resDialogNegativeButtonText() { if (mResDialogNegativeButtonText != null) { return mResDialogNegativeButtonText; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogNegativeButtonText(); } return DEFAULT_RES_VALUE; } @Override public int resDialogCommentPrompt() { if (mResDialogCommentPrompt != null) { return mResDialogCommentPrompt; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogCommentPrompt(); } return DEFAULT_RES_VALUE; } @Override public int resDialogEmailPrompt() { if (mResDialogEmailPrompt != null) { return mResDialogEmailPrompt; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogEmailPrompt(); } return DEFAULT_RES_VALUE; } @Override public int resDialogIcon() { if (mResDialogIcon != null) { return mResDialogIcon; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogIcon(); } return DEFAULT_DIALOG_ICON; } @Override public int resDialogOkToast() { if (mResDialogOkToast != null) { return mResDialogOkToast; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogOkToast(); } return DEFAULT_RES_VALUE; } @Override public int resDialogText() { if (mResDialogText != null) { return mResDialogText; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogText(); } return DEFAULT_RES_VALUE; } @Override public int resDialogTitle() { if (mResDialogTitle != null) { return mResDialogTitle; } if (mReportsCrashes != null) { return mReportsCrashes.resDialogTitle(); } return DEFAULT_RES_VALUE; } @Override public int resNotifIcon() { if (mResNotifIcon != null) { return mResNotifIcon; } if (mReportsCrashes != null) { return mReportsCrashes.resNotifIcon(); } return DEFAULT_NOTIFICATION_ICON; } @Override public int resNotifText() { if (mResNotifText != null) { return mResNotifText; } if (mReportsCrashes != null) { return mReportsCrashes.resNotifText(); } return DEFAULT_RES_VALUE; } @Override public int resNotifTickerText() { if (mResNotifTickerText != null) { return mResNotifTickerText; } if (mReportsCrashes != null) { return mReportsCrashes.resNotifTickerText(); } return DEFAULT_RES_VALUE; } @Override public int resNotifTitle() { if (mResNotifTitle != null) { return mResNotifTitle; } if (mReportsCrashes != null) { return mReportsCrashes.resNotifTitle(); } return DEFAULT_RES_VALUE; } @Override public int resToastText() { if (mResToastText != null) { return mResToastText; } if (mReportsCrashes != null) { return mReportsCrashes.resToastText(); } return DEFAULT_RES_VALUE; } @Override public int sharedPreferencesMode() { if (mSharedPreferenceMode != null) { return mSharedPreferenceMode; } if (mReportsCrashes != null) { return mReportsCrashes.sharedPreferencesMode(); } return DEFAULT_SHARED_PREFERENCES_MODE; } @Override public String sharedPreferencesName() { if (mSharedPreferenceName != null) { return mSharedPreferenceName; } if (mReportsCrashes != null) { return mReportsCrashes.sharedPreferencesName(); } return DEFAULT_STRING_VALUE; } @Override public int socketTimeout() { if (mSocketTimeout != null) { return mSocketTimeout; } if (mReportsCrashes != null) { return mReportsCrashes.socketTimeout(); } return DEFAULT_SOCKET_TIMEOUT; } @Override public boolean logcatFilterByPid() { if (mLogcatFilterByPid != null) { return mLogcatFilterByPid; } if (mReportsCrashes != null) { return mReportsCrashes.logcatFilterByPid(); } return DEFAULT_LOGCAT_FILTER_BY_PID; } @Override public boolean sendReportsInDevMode() { if (mSendReportsInDevMode != null) { return mSendReportsInDevMode; } if (mReportsCrashes != null) { return mReportsCrashes.sendReportsInDevMode(); } return DEFAULT_SEND_REPORTS_IN_DEV_MODE; } @Override public boolean sendReportsAtShutdown() { if (mSendReportsAtShutdown != null) { return mSendReportsAtShutdown; } if (mReportsCrashes != null) { return mReportsCrashes.sendReportsAtShutdown(); } return DEFAULT_SEND_REPORTS_AT_SHUTDOWN; } @Override public String[] excludeMatchingSharedPreferencesKeys() { if (mExcludeMatchingSharedPreferencesKeys != null) { return mExcludeMatchingSharedPreferencesKeys; } if (mReportsCrashes != null) { return mReportsCrashes.excludeMatchingSharedPreferencesKeys(); } return new String[0]; } @Override public String[] excludeMatchingSettingsKeys() { if (mExcludeMatchingSettingsKeys != null) { return mExcludeMatchingSettingsKeys; } if (mReportsCrashes != null) { return mReportsCrashes.excludeMatchingSettingsKeys(); } return new String[0]; } @Override /** * Will return null if no value has been configured. * It is up to clients to construct the recommended default value oof context.getClass().getPackage().getName() + BuildConfig.class */ public Class buildConfigClass() { if (mBuildConfigClass != null) { return mBuildConfigClass; } if ((mReportsCrashes != null) && (mReportsCrashes.buildConfigClass() != null)) { return mReportsCrashes.buildConfigClass(); } return null; } @Override public String applicationLogFile() { if (mApplicationLogFile != null) { return mApplicationLogFile; } if (mReportsCrashes != null) { return mReportsCrashes.applicationLogFile(); } return DEFAULT_APPLICATION_LOGFILE; } @Override public int applicationLogFileLines() { if (mApplicationLogFileLines != null) { return mApplicationLogFileLines; } if (mReportsCrashes != null) { return mReportsCrashes.applicationLogFileLines(); } return DEFAULT_APPLICATION_LOGFILE_LINES; } @Override public boolean disableSSLCertValidation() { if (mDisableSSLCertValidation != null) { return mDisableSSLCertValidation; } if (mReportsCrashes != null) { return mReportsCrashes.disableSSLCertValidation(); } return DEFAULT_DISABLE_SSL_CERT_VALIDATION; } @Override public String httpsSocketFactoryFactoryClass() { if (mHttpsSocketFactoryFactoryClass != null) { return mHttpsSocketFactoryFactoryClass; } if (mReportsCrashes != null) { return mReportsCrashes.httpsSocketFactoryFactoryClass(); } return null; } @Override public Class<? extends BaseCrashReportDialog> reportDialogClass() { if (mReportDialogClass != null) { return mReportDialogClass; } if (mReportsCrashes != null) { return mReportsCrashes.reportDialogClass(); } return CrashReportDialog.class; } /** * @param httpsSocketFactoryFactory HttpsSocketFactoryFactory to set. */ @SuppressWarnings( "unused" ) public void setHttpsSocketFactoryFactory(HttpsSocketFactoryFactory httpsSocketFactoryFactory) { this.mHttpsSocketFactoryFactory = httpsSocketFactoryFactory; } public HttpsSocketFactoryFactory getHttpSocketFactoryFactory() { if (mHttpsSocketFactoryFactory != null) { return mHttpsSocketFactoryFactory; } final String httpsSocketFactoryFactoryClass = httpsSocketFactoryFactoryClass(); if (httpsSocketFactoryFactoryClass != null) { try { final Object object = reflectionHelper.create(mReportsCrashes.httpsSocketFactoryFactoryClass()); if (object instanceof HttpsSocketFactoryFactory) { mHttpsSocketFactoryFactory = (HttpsSocketFactoryFactory) object; } else { ACRA.log.w(LOG_TAG, "Using default httpsSocketFactoryFactory - not a HttpSocketFactoryFactory : " + httpsSocketFactoryFactoryClass); } } catch (ReflectionException e) { ACRA.log.w(LOG_TAG, "Using default httpsSocketFactoryFactory - Could not construct : " + httpsSocketFactoryFactoryClass); } } // If it's still null then take the default if (mHttpsSocketFactoryFactoryClass == null) { mHttpsSocketFactoryFactory = DefaultHttpsSocketFactoryFactory.INSTANCE; } return mHttpsSocketFactoryFactory; } @Override public Method httpMethod() { if (mHttpMethod != null) { return mHttpMethod; } if (mReportsCrashes != null) { return mReportsCrashes.httpMethod(); } return Method.POST; } @Override public Type reportType() { if (mReportType != null) { return mReportType; } if (mReportsCrashes != null) { return mReportsCrashes.reportType(); } return Type.FORM; } public KeyStore keyStore() { if (mKeyStore != null) { return mKeyStore; } return null; } public static boolean isNull(String aString) { return aString == null || ACRAConstants.NULL_VALUE.equals(aString); } }