/* * Copyright 2010 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.collector; import java.util.Map; import java.util.TreeMap; import org.acra.ACRA; import org.acra.annotation.ReportsCrashes; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import static org.acra.ACRA.LOG_TAG; /** * Collects the content (key/value pairs) of SharedPreferences, from the * application default preferences or any other preferences asked by the * application developer. */ final class SharedPreferencesCollector { /** * Collects all key/value pairs in SharedPreferences and writes them in a * result String. The application default SharedPreferences are always * collected, and the developer can provide additional SharedPreferences * names in the {@link ReportsCrashes#additionalSharedPreferences()} * configuration item. * * * * @param context * the application context. * @return A readable formatted String containing all key/value pairs. */ public static String collect(Context context) { final StringBuilder result = new StringBuilder(); // Include the default SharedPreferences final Map<String, SharedPreferences> sharedPrefs = new TreeMap<String, SharedPreferences>(); sharedPrefs.put("default", PreferenceManager.getDefaultSharedPreferences(context)); // Add in any additional SharedPreferences final String[] sharedPrefIds = ACRA.getConfig().additionalSharedPreferences(); if (sharedPrefIds != null) { for (final String sharedPrefId : sharedPrefIds) { sharedPrefs.put(sharedPrefId, context.getSharedPreferences(sharedPrefId, Context.MODE_PRIVATE)); } } // Iterate over all included preference files and add the preferences from each. for (Map.Entry<String, SharedPreferences> entry : sharedPrefs.entrySet()) { final String sharedPrefId = entry.getKey(); final SharedPreferences prefs = entry.getValue(); final Map<String, ?> prefEntries = prefs.getAll(); // Show that we have no preferences saved for that preference file. if (prefEntries.isEmpty()) { result.append(sharedPrefId).append('=').append("empty\n"); continue; } // Add all non-filtered preferences from that preference file. for (final String key : prefEntries.keySet()) { if (filteredKey(key)) { ACRA.log.d(LOG_TAG, "Filtered out sharedPreference=" + sharedPrefId + " key=" + key + " due to filtering rule"); } else { final Object prefValue = prefEntries.get(key); result.append(sharedPrefId).append('.').append(key).append('='); result.append(prefValue == null ? "null" : prefValue.toString()); result.append("\n"); } } result.append('\n'); } return result.toString(); } /** * Checks if the key matches one of the patterns provided by the developer * to exclude some preferences from reports. * * @param key * the name of the preference to be checked * @return true if the key has to be excluded from reports. */ private static boolean filteredKey(String key) { for (String regex : ACRA.getConfig().excludeMatchingSharedPreferencesKeys()) { if(key.matches(regex)) { return true; } } return false; } }