at.univie.sensorium.preferences.Preferences.java Source code

Java tutorial

Introduction

Here is the source code for at.univie.sensorium.preferences.Preferences.java

Source

/*
 *  This file is part of Sensorium.
 *
 *   Sensorium is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU Lesser General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   Sensorium is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Lesser General Public License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with Sensorium. If not, see
 *   <http://www.gnu.org/licenses/>.
 * 
 * 
 */

package at.univie.sensorium.preferences;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;

import org.apache.http.message.BasicNameValuePair;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import at.univie.sensorium.R;
import at.univie.sensorium.SensorRegistry;

import com.google.gson.stream.JsonReader;

public class Preferences {

    public static final String SENSOR_AUTOSTART_PREF = "sensor_autostart";
    public static final String INTERFACES_XMLRPC_PREF = "xmlrpc_enabled";
    public static final String UPLOAD_URL_PREF = "upload_url";
    public static final String UPLOAD_USERNAME = "o3gm_upload_user";
    public static final String UPLOAD_PASSWORD = "o3gm_upload_user_password";
    public static final String UPLOAD_AUTOMATIC_PREF = "upload_automatic";
    public static final String UPLOAD_WIFI_PREF = "upload_wifi";
    public static final String UPLOAD_INTERVAL_PREF = "upload_interval";
    public static final String PRIVACY_HASH = "privacy_hash";
    // public static final String FIRST_RUN = "first_run";
    public static final String PREFERENCES_VERSION = "preferences_version";

    public static final String WELCOME_SCREEN_SHOWN = "welcome_screen_shown";

    private Context context;
    private SharedPreferences prefs;

    public Preferences(Context context) {
        this.context = context;
        prefs = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public void putPreference(String key, String value) {
        Log.d(SensorRegistry.TAG, "Setting pref " + key + " from remote config to: " + value);

        if (value.toLowerCase(Locale.US).equals("true")) {
            putBoolean(key, true);
        } else if (value.toLowerCase(Locale.US).equals("false")) {
            putBoolean(key, false);
        } else if (isInt(value)) {
            putInt(key, Integer.parseInt(value));
        } else { // value is String
            putString(key, value);
        }
    }

    private boolean isInt(String str) {
        try {
            int i = Integer.parseInt(str);
        } catch (NumberFormatException nfe) {
            return false;
        }
        return true;
    }

    public void putBoolean(String key, Boolean value) {
        prefs.edit().putBoolean(key, value).commit();
        Log.d(SensorRegistry.TAG, key + " boolean " + String.valueOf(value));
    }

    public void putInt(String key, Integer value) {
        prefs.edit().putInt(key, value).commit();
        Log.d(SensorRegistry.TAG, key + " int " + value);
    }

    public void putString(String key, String value) {
        prefs.edit().putString(key, value).commit();
        Log.d(SensorRegistry.TAG, key + " String " + value);
    }

    public Integer getInt(String key, Integer defaultvalue) {
        return prefs.getInt(key, defaultvalue);
    }

    public Boolean getBoolean(String key, Boolean defaultvalue) {
        return prefs.getBoolean(key, defaultvalue);
    }

    public String getString(String key, String defaultvalue) {
        return prefs.getString(key, defaultvalue);
    }

    public void loadDefaultPreferences() {
        loadPrefsFromStream(context.getResources().openRawResource(R.raw.defaultpreferences));
    }

    public void loadCampaignPreferences(final String u) {
        urlstring = u;
        Thread x = new Thread(prefretriever);
        x.start();

    }

    private void loadPrefsFromStream(InputStream input) {
        List<BasicNameValuePair> preferencelist = new LinkedList<BasicNameValuePair>();
        try {
            InputStreamReader isreader = new InputStreamReader(input);
            JsonReader reader = new JsonReader(isreader);
            //         String jsonVersion = "";

            reader.beginArray(); // do we have an array or just a single object?
            reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                String value = reader.nextString();
                if (name.equalsIgnoreCase(PREFERENCES_VERSION))
                    currentPrefVersion = Integer.valueOf(value);
                BasicNameValuePair kv = new BasicNameValuePair(name, value);
                preferencelist.add(kv);
            }
            reader.endObject();
            reader.endArray();
            reader.close();

            if (newerPrefsAvailable()) {
                Log.d(SensorRegistry.TAG, "Newer preferences available in json, overwriting existing.");
                for (BasicNameValuePair kv : preferencelist) {
                    putPreference(kv.getName(), kv.getValue());
                }
                // also reset the welcome screen
                putBoolean(WELCOME_SCREEN_SHOWN, false);
            } else {
                Log.d(SensorRegistry.TAG, "Preferences are recent, not overwriting.");
            }

        } catch (FileNotFoundException e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            Log.d(SensorRegistry.TAG, sw.toString());
        } catch (IOException e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            Log.d(SensorRegistry.TAG, sw.toString());
        }
    }

    private int currentPrefVersion;
    private boolean newerprefsavailable = false;

    public boolean newerPrefsAvailable() {
        if (currentPrefVersion > getInt(PREFERENCES_VERSION, 0))
            newerprefsavailable = true;
        //      return false;
        return newerprefsavailable;
    }

    private String urlstring;
    private Runnable prefretriever = new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(urlstring);
                URLConnection urlConnection = url.openConnection();
                urlConnection.setConnectTimeout(1000);
                loadPrefsFromStream(urlConnection.getInputStream());
                Log.d(SensorRegistry.TAG, "Done loading remote preferences");
            } catch (IOException e) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                e.printStackTrace(pw);
                Log.d(SensorRegistry.TAG, sw.toString());
            }
        }
    };
}