package com.eveningoutpost.dexdrip.UtilityModels; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.BatteryManager; import android.os.Bundle; import android.os.PowerManager; import android.preference.PreferenceManager; import android.provider.BaseColumns; import android.util.Log; import com.activeandroid.Model; import com.activeandroid.annotation.Column; import com.activeandroid.annotation.Table; import com.activeandroid.query.Select; import com.eveningoutpost.dexdrip.Models.BgReading; import com.eveningoutpost.dexdrip.ShareModels.ShareRest; import com.eveningoutpost.dexdrip.widgetUpdateService; import java.util.List; /** * Created by stephenblack on 11/7/14. */ @Table(name = "BgSendQueue", id = BaseColumns._ID) public class BgSendQueue extends Model { @Column(name = "bgReading", index = true) public BgReading bgReading; @Column(name = "success", index = true) public boolean success; @Column(name = "mongo_success", index = true) public boolean mongo_success; @Column(name = "operation_type") public String operation_type; public static BgSendQueue nextBgJob() { return new Select() .from(BgSendQueue.class) .where("success = ?", false) .orderBy("_ID desc") .limit(1) .executeSingle(); } public static List<BgSendQueue> queue() { return new Select() .from(BgSendQueue.class) .where("success = ?", false) .orderBy("_ID asc") .limit(20) .execute(); } public static List<BgSendQueue> mongoQueue() { return new Select() .from(BgSendQueue.class) .where("mongo_success = ?", false) .where("operation_type = ?", "create") .orderBy("_ID asc") .limit(30) .execute(); } public static void addToQueue(BgReading bgReading, String operation_type, Context context) { PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "sendQueue"); wakeLock.acquire(); BgSendQueue bgSendQueue = new BgSendQueue(); bgSendQueue.operation_type = operation_type; bgSendQueue.bgReading = bgReading; bgSendQueue.success = false; bgSendQueue.mongo_success = false; bgSendQueue.save(); Log.d("BGQueue", "New value added to queue!"); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); Intent updateIntent = new Intent(Intents.ACTION_NEW_BG_ESTIMATE_NO_DATA); context.sendBroadcast(updateIntent); context.startService(new Intent(context, widgetUpdateService.class)); if (prefs.getBoolean("cloud_storage_mongodb_enable", false) || prefs.getBoolean("cloud_storage_api_enable", false)) { Log.w("SENSOR QUEUE:", String.valueOf(bgSendQueue.mongo_success)); if (operation_type.compareTo("create") == 0) { MongoSendTask task = new MongoSendTask(context, bgSendQueue); task.execute(); } } if(prefs.getBoolean("broadcast_data_through_intents", false)) { Log.i("SENSOR QUEUE:", "Broadcast data"); final Bundle bundle = new Bundle(); bundle.putDouble(Intents.EXTRA_BG_ESTIMATE, bgReading.calculated_value); bundle.putDouble(Intents.EXTRA_BG_SLOPE, bgReading.calculated_value_slope); if(bgReading.hide_slope) { bundle.putString(Intents.EXTRA_BG_SLOPE_NAME, "9"); } else { bundle.putString(Intents.EXTRA_BG_SLOPE_NAME, bgReading.slopeName()); } bundle.putInt(Intents.EXTRA_SENSOR_BATTERY, getBatteryLevel(context)); bundle.putLong(Intents.EXTRA_TIMESTAMP, bgReading.timestamp); Intent intent = new Intent(Intents.ACTION_NEW_BG_ESTIMATE); intent.putExtras(bundle); context.sendBroadcast(intent, Intents.RECEIVER_PERMISSION); } if(prefs.getBoolean("broadcast_to_pebble", false)) { PebbleSync pebbleSync = new PebbleSync(); pebbleSync.sendData(context, bgReading); } if(prefs.getBoolean("share_upload", false)) { ShareRest shareRest = new ShareRest(context); Log.w("ShareRest", "About to call ShareRest!!"); shareRest.sendBgData(bgReading); } wakeLock.release(); } public void markMongoSuccess() { mongo_success = true; save(); } public static int getBatteryLevel(Context context) { Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); if(level == -1 || scale == -1) { return 50; } return (int)(((float)level / (float)scale) * 100.0f); } }