at.univie.sensorium.SensorService.java Source code

Java tutorial

Introduction

Here is the source code for at.univie.sensorium.SensorService.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;

import java.io.PrintWriter;
import java.io.StringWriter;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Binder;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import at.univie.sensorium.logging.JSONLogger;
import at.univie.sensorium.preferences.Preferences;
import at.univie.sensorium.sensors.AbstractSensor;

public class SensorService extends Service {
    private SensorRegistry registry;
    private static final int NOTIFICATION = 42;
    private final IBinder mBinder = new LocalBinder();

    @Override
    public IBinder onBind(Intent intent) {
        Log.d("LocalService", "Received bind intent: " + intent);
        init();
        return mBinder;
    }

    public class LocalBinder extends Binder {
        SensorService getService() {
            return SensorService.this;
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("LocalService", "Received start id " + startId + ": " + intent);
        init();
        return START_STICKY;
    }

    private void init() {

        Preferences preferences = new Preferences(this);
        registry = SensorRegistry.getInstance();
        registry.setPreferences(preferences);

        preferences.loadDefaultPreferences();

        startSensors();
        registry.startup(this);
        startExtInterfaces();
    }

    private void startSensors() {
        Resources res = getResources();
        String[] sensorclassnames = res.getStringArray(R.array.sensors);

        for (String classname : sensorclassnames) {
            Log.d("SENSORS", classname);
            try {
                AbstractSensor s = (AbstractSensor) Class.forName(classname).newInstance();
                SensorRegistry.getInstance().registerSensor(s);
            } catch (ClassNotFoundException e) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                e.printStackTrace(pw);
                Log.d(SensorRegistry.TAG, sw.toString());
            } catch (InstantiationException e) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                e.printStackTrace(pw);
                Log.d(SensorRegistry.TAG, sw.toString());
            } catch (IllegalAccessException e) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                e.printStackTrace(pw);
                Log.d(SensorRegistry.TAG, sw.toString());
            }
        }
    }

    private void startExtInterfaces() {
        registry.startXMLRPCInterface();
        createJSONLoggerUploader();
        registry.getJSONLogger().init(registry.getSensors());
    }

    private void createJSONLoggerUploader() {
        registry.setJSONLogger(new JSONLogger());
        Preferences prefs = SensorRegistry.getInstance().getPreferences();
        if (prefs.getBoolean(Preferences.UPLOAD_AUTOMATIC_PREF, false)) {
            int interval = prefs.getInt(Preferences.UPLOAD_INTERVAL_PREF, 3600);
            boolean wifi = prefs.getBoolean(Preferences.UPLOAD_WIFI_PREF, false);
            String url = prefs.getString(Preferences.UPLOAD_URL_PREF, "");
            registry.getJSONLogger().autoupload(url, interval, wifi);

        }
    }

    @Override
    public void onCreate() {
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SensoriumActivity.class),
                PendingIntent.FLAG_CANCEL_CURRENT);
        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

        builder.setContentIntent(contentIntent).setSmallIcon(R.drawable.ic_launcher)
                .setWhen(System.currentTimeMillis()).setAutoCancel(true).setContentTitle(SensorRegistry.TAG)
                .setContentText("running");
        Notification n = builder.build();
        nm.notify(NOTIFICATION, n);
    }

    @Override
    public void onDestroy() {
        registry.getJSONLogger().finalizeLog();
        ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).cancel(NOTIFICATION);
        Log.d(SensorRegistry.TAG, "SeattleSensors stopped");
    }

    public SensorRegistry getSensorRegistry() {
        return registry;
    }
}