package com.num.database.datasource; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; import org.apache.http.cookie.SetCookie; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import com.num.database.DatabaseOutput; import com.num.database.mapping.BaseMapping; import com.num.database.mapping.ThroughputMapping; import com.num.helpers.GAnalytics; import com.num.models.GraphData; import com.num.models.GraphPoint; import com.num.models.Link; import com.num.models.MainModel; import com.num.models.Model; import com.num.models.Throughput; import com.num.utils.DeviceUtil; public class ThroughputDataSource extends DataSource { private final String GRAPH_TYPE = "area"; private final String Y_AXIS_UNITS = "kbps"; private final boolean IS_PURGE_ALLOWED = true; private final String[] MODES = {"normal","aggregate"}; public ThroughputDataSource(Context context) { super(context); setDBHelper(new ThroughputMapping(context)); } public boolean isPurgeAllowed() { return IS_PURGE_ALLOWED; } public void addRow(Link l, String type, String connectionType) { ContentValues value = new ContentValues(); final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = sdf.format(new Date()); value.put(ThroughputMapping.COLUMN_TIME, time); value.put(ThroughputMapping.COLUMN_SPEED, "" + l.speedInBits()); value.put(ThroughputMapping.COLUMN_TYPE, type); value.put(ThroughputMapping.COLUMN_CONNECTION,connectionType); long insertId = database.insert(dbHelper.getTableName(), null, value); Cursor cursor = database.query(dbHelper.getTableName(), getColumns(), ThroughputMapping.COLUMN_ID + " = " + insertId, null, null, null, null); cursor.moveToFirst(); Map<String,String> newThroughputData = dbHelper.getDatabaseColumns().getDataStore(cursor); cursor.close(); } protected void insertModel(Model model) { try { String currentConnectionType = DeviceUtil.getNetworkInfo(context); addRow(((Throughput)model).getDownLink(), "downlink", currentConnectionType); addRow(((Throughput)model).getUpLink(), "uplink", currentConnectionType); } catch (Exception e) { GAnalytics.log(GAnalytics.DATABASE, "Insert Fail " + dbHelper.getDBName(),e.getMessage()); } } public DatabaseOutput getOutput(String currentConnectionType) { List<Map<String,String>> allData = getDataStores(); int totalUpload = 0; int totalDownload = 0; int countUpload = 0; int countDownload = 0; for (Map<String,String> data : allData) { if(!data.get(ThroughputMapping.COLUMN_CONNECTION).equals(currentConnectionType)) { continue; } if(data.get(ThroughputMapping.COLUMN_TYPE).equals("uplink")){ try { totalUpload+=(int)Double.parseDouble(data.get(ThroughputMapping.COLUMN_SPEED)); countUpload++; } catch (Exception e) { continue; } } else if(data.get(ThroughputMapping.COLUMN_TYPE).equals("downlink")){ try { totalDownload+=(int)Double.parseDouble(data.get(ThroughputMapping.COLUMN_SPEED)); countDownload++; } catch (Exception e) { continue; } } } if(countDownload==0) countDownload++; if(countUpload==0) countUpload++; DatabaseOutput output = new DatabaseOutput(); output.add("avg_upload", ""+totalUpload/countUpload); output.add("avg_download", ""+totalDownload/countDownload); return output; } public DatabaseOutput getOutput() { return getOutput(DeviceUtil.getNetworkInfo(context)); } public HashMap<String, ArrayList<GraphPoint>> getGraphData() { return getGraphData(DeviceUtil.getNetworkInfo(context)); } public HashMap<String, ArrayList<GraphPoint>> getGraphData(String currentConnectionType) { List<Map<String,String>> allData = getDataStores(); ArrayList<GraphPoint> downloadPoints = new ArrayList<GraphPoint>(); ArrayList<GraphPoint> uploadPoints = new ArrayList<GraphPoint>(); for (Map<String,String> data : allData) { if(!data.get(ThroughputMapping.COLUMN_CONNECTION).equals(currentConnectionType)) { continue; } if(data.get(ThroughputMapping.COLUMN_TYPE).equals("uplink")){ try { uploadPoints.add(new GraphPoint(uploadPoints.size(),extractValue(data),extractTime(data))); } catch (Exception e) { continue; } } else if(data.get(ThroughputMapping.COLUMN_TYPE).equals("downlink")){ try { downloadPoints.add(new GraphPoint(downloadPoints.size(),extractValue(data),extractTime(data))); } catch (Exception e) { continue; } } } HashMap collection = new HashMap<String,ArrayList<GraphPoint>>(); collection.put("uplink", uploadPoints); collection.put("downlink", downloadPoints); return collection; } @Override public int extractValue(Map<String, String> data) { return (int)Double.parseDouble(data.get(ThroughputMapping.COLUMN_SPEED)); } @Override public Date extractTime(Map<String, String> data) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = data.get(ThroughputMapping.COLUMN_TIME); try { return df.parse(dateString); } catch (ParseException e) { e.printStackTrace(); return new Date(); } } @Override public String getGraphType() { return GRAPH_TYPE; } @Override public String getYAxisLabel() { return Y_AXIS_UNITS; } @Override public void aggregatePoints(GraphPoint oldP, GraphPoint newP) { oldP.incrementCount(); oldP.y+=newP.y; } @Override public String[] getModes() { return MODES; } }