/******************************************************************************* * Copyright 2011 The Regents of the University of California * * 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.ohmage.triggers.notif; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.ohmage.triggers.config.NotifConfig; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; /* * The class which can parse and represent the trigger * notification description in JSON. * * An example notification description: * * { * "duration": 60 //minutes * "suppression": 30 //minutes * "repeat": [5, 10, 30] //array of minutes * } */ public class NotifDesc { private static final String PREF_FILE_NAME = "edu.ucla.cens.triggers.notif.NotifDesc"; private static final String PREF_KEY_GLOBAL_NOTIF_DESC = "notif_desc"; //The minimum value allowed for a repeat reminder private static final int REPEAT_MIN = 1; private static final String KEY_DURATION = "duration"; private static final String KEY_SUPPRESSION = "suppression"; private static final String KEY_REPEAT = "repeat"; private int mDuration; private int mSuppress; private LinkedList<Integer> mRepeatList = new LinkedList<Integer>(); private void initialze() { mDuration = 0; mSuppress = 0; mRepeatList.clear(); } /* * Parse a notification description in JSON format and * load the parameters into this object. */ public boolean loadString(String desc) { initialze(); if(desc == null) { return false; } try { //Load the string JSONObject jDesc = new JSONObject(desc); mDuration = jDesc.getInt(KEY_DURATION); mSuppress = jDesc.getInt(KEY_SUPPRESSION); if(jDesc.has(KEY_REPEAT)) { mRepeatList.clear(); JSONArray repeats = jDesc.getJSONArray(KEY_REPEAT); for(int i = 0; i < repeats.length(); i++) { mRepeatList.add(repeats.getInt(i)); } } } catch (JSONException e) { return false; } return true; } /* * Get the notification duration in minutes */ public int getDuration() { return mDuration; } /* * Set the notification duration in minutes */ public void setDuration(int duration) { mDuration = duration; } /* * Get the suppression window in minutes. */ public int getSuppression() { return mSuppress; } /* * Set the suppression window in minutes */ public void setSuppression(int suppress) { mSuppress = suppress; } /* * Get the list (sorted) of reminders associated * with this notification description. Each item * is in minutes. */ public List<Integer> getSortedRepeats() { LinkedList<Integer> ret = new LinkedList<Integer>(mRepeatList); Collections.sort(ret, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { return (a - b); } }); return ret; } /* * Set the list of repeat reminders for this description. * The items in the list must be represented in minutes. * This function will replace the previous set of repeat * reminders in this description with the given list. */ public void setRepeats(List<Integer> repeats) { mRepeatList.clear(); for(Integer repeat : repeats) { if(!mRepeatList.contains(repeat)) { mRepeatList.add(repeat); } } } /* * Utility function to support the maintenance of a global * notification description (as opposed to different description * for different triggers). This function will return the string * representation of the global notification description stored in * the shared preferences. */ public static String getGlobalDesc(Context context) { SharedPreferences prefs = context.getSharedPreferences( PREF_FILE_NAME, Context.MODE_PRIVATE); String notifDesc = prefs.getString(PREF_KEY_GLOBAL_NOTIF_DESC, NotifConfig.defaultConfig); return notifDesc; } /* * Utility function to support the maintenance of a global * notification description (as opposed to different description * for different triggers). This function can be used to set the * global description and it will be saved in shared preferences. */ public static void setGlobalDesc(Context context, String desc) { SharedPreferences prefs = context.getSharedPreferences( PREF_FILE_NAME, Context.MODE_PRIVATE); Editor editor = prefs.edit(); editor.putString(PREF_KEY_GLOBAL_NOTIF_DESC, desc); editor.commit(); // TrigPrefManager.registerPreferenceFile(context, PREF_FILE_NAME); } /* * Get the default notification description for a trigger. * This function can be used while adding a new trigger entry * to the database. * * Currently returns the global notification description. */ public static String getDefaultDesc(Context context) { return getGlobalDesc(context); } /* * Get the minimum allowed value (in minutes) for a * repeat reminder. */ public int getMinAllowedRepeat() { return REPEAT_MIN; } /* * Convert the notification description represented by * this object to a JSON string. */ public String toString() { JSONObject jDesc = new JSONObject(); try { jDesc.put(KEY_DURATION, mDuration); jDesc.put(KEY_SUPPRESSION, mSuppress); JSONArray repeats = new JSONArray(); for(int repeat : mRepeatList) { repeats.put(repeat); } if(repeats.length() > 0) { jDesc.put(KEY_REPEAT, repeats); } } catch (JSONException e) { return null; } return jDesc.toString(); } }