org.starfishrespect.myconsumption.android.tasks.SensorValuesUpdater.java Source code

Java tutorial

Introduction

Here is the source code for org.starfishrespect.myconsumption.android.tasks.SensorValuesUpdater.java

Source

package org.starfishrespect.myconsumption.android.tasks;

import android.os.AsyncTask;
import android.util.Log;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.starfishrespect.myconsumption.android.SingleInstance;
import org.starfishrespect.myconsumption.android.dao.DatabaseHelper;
import org.starfishrespect.myconsumption.android.dao.SensorValuesDao;
import org.starfishrespect.myconsumption.android.data.SensorData;
import org.starfishrespect.myconsumption.android.data.SensorValue;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.starfishrespect.myconsumption.android.util.CryptoUtils;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Update sensor values.
 * S23Y (2015). Licensed under the Apache License, Version 2.0.
 */
public class SensorValuesUpdater {

    public interface UpdateFinishedCallback {
        public void onUpdateFinished();
    }

    private UpdateFinishedCallback updateFinishedCallback;
    private static final String TAG = "SensorValuesUpdater";

    public void setUpdateFinishedCallback(UpdateFinishedCallback updateFinishedCallback) {
        this.updateFinishedCallback = updateFinishedCallback;
    }

    public void refreshDB() {

        AsyncTask<Void, List, Void> task = new AsyncTask<Void, List, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                DatabaseHelper db = SingleInstance.getDatabaseHelper();
                RestTemplate template = new RestTemplate();
                HttpHeaders httpHeaders = CryptoUtils.createHeadersCurrentUser();
                ResponseEntity<List> responseEnt;
                template.getMessageConverters().add(new MappingJacksonHttpMessageConverter());

                try {
                    SensorValuesDao valuesDao = new SensorValuesDao(db);
                    for (SensorData sensor : db.getSensorDao().queryForAll()) {
                        int startTime = (int) (sensor.getLastLocalValue().getTime() / 1000);
                        String url = String.format(SingleInstance.getServerUrl() + "sensors/%s/data?start=%d",
                                sensor.getSensorId(), startTime);
                        Log.d(TAG, url);
                        responseEnt = template.exchange(url, HttpMethod.GET, new HttpEntity<>(httpHeaders),
                                List.class);
                        List<List<Integer>> sensorData = responseEnt.getBody();
                        List<SensorValue> values = new ArrayList<>();
                        long last = 0;
                        long first = Long.MAX_VALUE;
                        for (List<Integer> value : sensorData) {
                            values.add(new SensorValue(value.get(0), value.get(1)));
                            if (value.get(0) > last) {
                                last = value.get(0);
                            }
                            if (value.get(0) < first) {
                                first = value.get(0);
                            }
                        }
                        valuesDao.insertSensorValues(sensor.getSensorId(), values);
                        sensor.setLastLocalValue(new Date(last * 1000));
                        long formerFirst = sensor.getFirstLocalValue().getTime() / 1000;
                        if (formerFirst > first || formerFirst == 0) {
                            sensor.setFirstLocalValue(new Date(first * 1000));
                        }
                        db.getSensorDao().update(sensor);
                        Log.d(TAG, "Inserted values to " + last);
                    }
                } catch (SQLException e) {
                    Log.e(TAG, "Error:" + e.toString());
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                if (updateFinishedCallback != null) {
                    updateFinishedCallback.onUpdateFinished();
                }
            }
        };

        task.execute();
    }
}