package org.kvj.bravo7; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; import java.util.Set; import android.app.Activity; import android.app.Application; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; abstract public class ApplicationContext extends Application { public class LogEntry { String entry; Date date = new Date(); public LogEntry(String entry) { this.entry = entry; } public Date getDate() { return date; } public String getText() { return entry; } } public static final String PREF_NAME = "prefs"; private static final String TAG = "ApplicationContext"; private SharedPreferences preferences = null; private Map<String, Object> registry = new HashMap<String, Object>(); private static final int MAX_LOG = 100; private Queue<LogEntry> log = new LinkedList<ApplicationContext.LogEntry>(); private boolean initDone = false; public ApplicationContext() { super(); // preferences = // PreferenceManager.getDefaultSharedPreferences(getBaseContext()); instance = this; } private static ApplicationContext instance = null; public static ApplicationContext getInstance() { if (!instance.initDone) { instance.initDone = true; instance.init(); } return instance; } abstract protected void init(); public SharedPreferences getPreferences() { if (null == preferences) { preferences = PreferenceManager.getDefaultSharedPreferences(this); } return preferences; } public String getStringPreference(String name, String defaultValue) { return getPreferences().getString(name, defaultValue); } public String getStringPreference(int name, int defaultValue) { return getPreferences().getString(getString(name), getString(defaultValue)); } public void setStringPreference(String name, String value) { getPreferences().edit().putString(name, value).commit(); } public List<String> getStringArrayPreference(String name) { List<String> result = new ArrayList<String>(); String ids = getStringPreference(name, ""); String[] arr = ids.split(" "); for (String id : arr) { if (id != null && !"".equals(id)) { result.add(id); } } return result; } public List<String> setStringArrayPreference(String name, String id, boolean add) { return setStringArrayPreference(name, id, add, -1); } public List<String> setStringArrayPreference(String name, List<String> ids) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < ids.size(); i++) { if (i > 0) { builder.append(" "); } builder.append(ids.get(i)); } setStringPreference(name, builder.toString()); return ids; } public List<String> setStringArrayPreference(String name, String id, boolean add, int index) { List<String> result = getStringArrayPreference(name); if (id == null || "".equals(id)) { return result; } for (int i = 0; i < result.size(); i++) { if (id.equals(result.get(i))) { if (add) { return result;// Already here } else { result.remove(i); i--; } } } if (add) { if (-1 == index) { result.add(id); } else { result.add(index, id); } } return setStringArrayPreference(name, result); } public int getIntPreference(String name, int defaultID) { try { return Integer.parseInt(getPreferences().getString(name, getString(defaultID))); } catch (Exception e) { try { return Integer.parseInt(getString(defaultID)); } catch (Exception e2) { } } return -1; } public int getIntPreference(int name, int defaultID) { return getIntPreference(getString(name), defaultID); } public void setIntPreference(String name, int value) { getPreferences().edit().putString(name, Integer.toString(value)).commit(); } public void setWidgetConfig(int id, String name) { setStringPreference("widget_" + id, name); } public SharedPreferences getWidgetConfig(int id, String name) { if (null != getStringPreference("widget_" + id, null)) { return getSharedPreferences("widget_" + id, Context.MODE_PRIVATE); } if (null != name) { setWidgetConfig(id, name); return getSharedPreferences("widget_" + id, Context.MODE_PRIVATE); } return null; } public SharedPreferences getWidgetConfig(int id) { return getWidgetConfig(id, null); } public Map<Integer, String> getWidgetConfigs(String provider) { Map<Integer, String> result = new LinkedHashMap<Integer, String>(); Set<String> keys = getPreferences().getAll().keySet(); AppWidgetManager manager = AppWidgetManager.getInstance(this); for (String key : keys) { if (key.startsWith("widget_")) { try { String name = getStringPreference(key, ""); int widgetID = Integer.parseInt(key.substring("widget_".length())); AppWidgetProviderInfo info = manager.getAppWidgetInfo(widgetID); if (info == null) { Log.w(TAG, "updateWidgets no info or config for " + widgetID); continue; } if (provider != null && !info.provider.getClassName().equals(provider)) { continue; } result.put(widgetID, name); } catch (Exception e) { Log.e(TAG, "getWidgetConfigs error:", e); } } } return result; } public void updateWidgets(int id) { Set<String> keys = getPreferences().getAll().keySet(); List<String> toRemove = new ArrayList<String>(); AppWidgetManager manager = AppWidgetManager.getInstance(this); for (String key : keys) { if (key.startsWith("widget_")) { try { // Log.i(TAG, "updateWidgets: key: "+key); // String type = getStringPreference(key, ""); int widgetID = Integer.parseInt(key.substring("widget_".length())); AppWidgetProviderInfo info = manager.getAppWidgetInfo(widgetID); if (info == null) { Log.w(TAG, "updateWidgets no info for " + widgetID); toRemove.add(key); continue; } if (id != -1 && id != widgetID) { // Log.w(TAG, "updateWidgets not a requested ID"); continue; } AppWidgetProvider provider = (AppWidgetProvider) getClass().getClassLoader() .loadClass(info.provider.getClassName()).newInstance(); // Log.i(TAG, "updateWidgets calling update..."); provider.onUpdate(this, manager, new int[] { widgetID }); } catch (Exception e) { Log.e(TAG, "updateWidgets error:", e); toRemove.add(key); } } } Editor editor = getPreferences().edit(); for (String key : toRemove) { editor.remove(key); } editor.commit(); } public void publishBean(Object object) { registry.put(object.getClass().getName(), object); } @SuppressWarnings("unchecked") public <T> T getBean(Class<T> cl) { return (T) registry.get(cl.getName()); } public void publishBean(String name, Object object) { registry.put(name, object); } @SuppressWarnings("unchecked") public <T> T getBean(String name, Class<T> cl) { return (T) registry.get(name); } public void log(String entry) { synchronized (log) { while (log.size() > MAX_LOG) { log.poll(); } log.add(new LogEntry(entry)); } } public Queue<LogEntry> getLog() { return log; } public Integer getWidgetConfigID(Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { int mAppWidgetId = extras .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (AppWidgetManager.INVALID_APPWIDGET_ID != mAppWidgetId) { return mAppWidgetId; } } return null; } public void setWidgetConfigDone(Activity activity) { Integer widgetID = getWidgetConfigID(activity.getIntent()); if (null != widgetID) { Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID); activity.setResult(Activity.RESULT_OK, resultValue); } } public boolean getBooleanPreference(int name, boolean def) { return getPreferences().getBoolean(getString(name), def); } public boolean getBooleanPreference(int name, int def) { boolean defBool = false; try { // defBool = Boolean.parseBoolean(getString(def)); } catch (Exception e) { } return getBooleanPreference(name, defBool); } public void setIntPreference(int id, int value) { setIntPreference(getString(id), value); } public void setStringPreference(int name, String value) { setStringPreference(getString(name), value); } }