/* * Copyright 2011 Google Inc. * * 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 com.google.ipc.invalidation.ticl.android.c2dm; import com.google.ipc.invalidation.external.client.SystemResources.Logger; import com.google.ipc.invalidation.external.client.android.service.AndroidLogger; import android.content.Context; import android.content.SharedPreferences; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.HashSet; import java.util.Set; /** * Stores and provides access to private settings used by the C2DM manager. */ public class C2DMSettings { private static final Logger logger = AndroidLogger.forTag("C2DMSettings"); static final String PREFERENCE_PACKAGE = "com.google.android.c2dm.manager"; static final String REGISTRATION_ID = "registrationId"; private static final String APPLICATION_VERSION = "applicationVersion"; private static final String BACKOFF = "c2dm_backoff"; private static final long BACKOFF_DEFAULT = 30000; private static final String OBSERVERS = "observers"; private static final String REGISTERING = "registering"; private static final String UNREGISTERING = "unregistering"; /** * Sets the C2DM registration ID. */ static void setC2DMRegistrationId(Context context, String registrationId) { storeField(context, REGISTRATION_ID, registrationId); } /** * Clears the C2DM registration ID. */ static void clearC2DMRegistrationId(Context context) { storeField(context, REGISTRATION_ID, null); } /** * Retrieves the C2DM registration ID (or {@code null} if not stored). */ static String getC2DMRegistrationId(Context context) { return retrieveField(context, REGISTRATION_ID, null); } /** * Returns {@code true} if there is a C2DM registration ID stored. */ static boolean hasC2DMRegistrationId(Context context) { return getC2DMRegistrationId(context) != null; } /** * Sets the application version. */ static void setApplicationVersion(Context context, String applicationVersion) { storeField(context, APPLICATION_VERSION, applicationVersion); } /** * Retrieves the application version (or {@code null} if not stored). */ static String getApplicationVersion(Context context) { return retrieveField(context, APPLICATION_VERSION, null); } /** * Returns the backoff setting. */ static long getBackoff(Context context) { return retrieveField(context, BACKOFF, BACKOFF_DEFAULT); } /** * Sets the backoff setting. * @param context * @param backoff */ static void setBackoff(Context context, long backoff) { storeField(context, BACKOFF, backoff); } /** * Resets the backoff setting to the default value. */ static void resetBackoff(Context context) { setBackoff(context, BACKOFF_DEFAULT); } /** * Sets the boolean flag indicating C2DM registration is in process. */ static void setRegistering(Context context, boolean registering) { storeField(context, REGISTERING, registering); } /** * Returns {@code true} if C2DM registration is in process. */ static boolean isRegistering(Context context) { return retrieveField(context, REGISTERING, false); } /** * Sets the boolean flag indicating C2DM unregistration is in process. */ static void setUnregistering(Context context, boolean registering) { storeField(context, UNREGISTERING, registering); } /** * Returns the boolean flag indicating C2DM unregistration is in process. */ static boolean isUnregistering(Context context) { return retrieveField(context, UNREGISTERING, false); } /** * Returns the set of stored observers. */ static Set<C2DMObserver> getObservers(Context context) { return createC2DMObserversFromJSON(retrieveField(context, OBSERVERS, null)); } /** * Sets the set of stored observers. */ static void setObservers(Context context, Set<C2DMObserver> observers) { storeField(context, OBSERVERS, createJsonObserversFromC2DMObservers(observers)); } private static Set<C2DMObserver> createC2DMObserversFromJSON(String jsonString) { // The observer set is stored in a json array of objects that contain the // observer json representation produced by C2DMObserver.toJSON. Iterate over // this array and recreate observers from the objects. Set<C2DMObserver> observers = new HashSet<C2DMObserver>(); if (jsonString == null) { return observers; } try { JSONArray array = new JSONArray(jsonString); for (int i = 0; i < array.length(); i++) { JSONObject jsonObserver = array.getJSONObject(i); C2DMObserver observer = C2DMObserver.createFromJSON(jsonObserver); if (observer != null) { observers.add(observer); } } } catch (JSONException e) { logger.severe("Unable to parse observers. Source: %s", jsonString); observers.clear(); // No partial result } return observers; } private static String createJsonObserversFromC2DMObservers(Set<C2DMObserver> observers) { // Stores the observers as an array of json objects in the format produced by // C2DMObserver.toJSON JSONArray array = new JSONArray(); for (C2DMObserver observer : observers) { JSONObject json = observer.toJSON(); if (json != null) { array.put(json); } } return array.toString(); } private static boolean retrieveField(Context context, String field, boolean defaultValue) { SharedPreferences preferences = getPreferences(context); return preferences.getBoolean(field, defaultValue); } private static void storeField(Context context, String field, boolean value) { SharedPreferences preferences = getPreferences(context); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean(field, value); editor.commit(); } private static long retrieveField(Context context, String field, long defaultValue) { SharedPreferences preferences = getPreferences(context); return preferences.getLong(field, defaultValue); } private static void storeField(Context context, String field, long value) { SharedPreferences preferences = getPreferences(context); SharedPreferences.Editor editor = preferences.edit(); editor.putLong(field, value); editor.commit(); } private static String retrieveField(Context context, String field, String defaultValue) { SharedPreferences preferences = getPreferences(context); return preferences.getString(field, defaultValue); } private static void storeField(Context context, String field, String value) { SharedPreferences preferences = getPreferences(context); SharedPreferences.Editor editor = preferences.edit(); editor.putString(field, value); editor.commit(); if (value == null) { logger.fine("Cleared field %s", field); } } private static SharedPreferences getPreferences(Context context) { return context.getSharedPreferences(PREFERENCE_PACKAGE, Context.MODE_PRIVATE); } /** Sets the C2DM registration id to {@code registrationId}. */ public static void setC2DMRegistrationIdForTest(Context context, String registrationId) { setC2DMRegistrationId(context, registrationId); } /** Sets the C2DM application version to {@code version}. */ public static void setApplicationVersionForTest(Context context, String version) { setApplicationVersion(context, version); } }