package com.safemobile.database; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import com.safemobile.lib.Contact; import com.safemobile.lib.Recording; import com.safemobile.lib.SM; import com.safemobile.lib.SMS; import com.safemobile.lib.Vehicle; import com.safemobile.lib.radio.Channel; import com.safemobile.lib.radio.Zone; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.provider.BaseColumns; import android.util.Log; public class DatabaseCommunication { /* Database */ private SQLiteDatabase database; private DataBaseHelper myDbHelper; private boolean first = false, READONLY = false;; private Context context; public DatabaseCommunication(Context context) { this.context = context; } // open database Connection public void openConnection() { // start database connection myDbHelper = new DataBaseHelper(context); try { myDbHelper.createDataBase(); Log.d("CONNECT", "Succes connection"); } catch (IOException ioe) { throw new Error("Unable to create database"); } // end database connection myDbHelper = new DataBaseHelper(context); try { if(database!=null) database.close(); database = myDbHelper.openDataBase(READONLY); Log.d("CONNECT", "Opened Connection"); }catch(SQLException sqle){ first = true; //throw sqle; } if(first) { try { if(database!=null) database.close(); database = myDbHelper.openDataBase(READONLY); Log.d("CONNECT", "Opened Connection"); }catch(SQLException sqle){ first = false; //throw sqle; } } } // close database Connection public void closeConnection() { database.close(); } public boolean isOpen() { if(database!=null) return database.isOpen(); else return false; } // get all vehicles public ArrayList getAllVehicle() { ArrayList allVehicles = new ArrayList(); // build iterator Cursor cursor = null; if(database == null) Log.d("NULL", "Database is null"); else { cursor = database.rawQuery("SELECT * from vehicle",new String [] {}); Log.d("CURSOR", "cursor created"); cursor.moveToFirst(); while (cursor.isAfterLast() == false) { //old = new Vehicle(int lp, String name, long driver_id, int time_route, int GPS_reporting_interval, int is_stolen) // new = Vehicle(int sc_id, String imei, int lp, String name, long driver_id, int time_route, int GPS_reporting_interval, int is_stolen) allVehicles.add(new Vehicle(0, "imei", cursor.getInt(1), cursor.getString(2), cursor.getInt(3), cursor.getInt(4), cursor.getInt(5), cursor.getInt(6))); // move to next record cursor.moveToNext(); } cursor.close(); } allVehicles.add(new Vehicle(0, "imei", 1, "Demo103", 89, 0, 0, 0)); allVehicles.add(new Vehicle(0, "imei", 1, "Demo104", 101, 0, 0, 0)); allVehicles.add(new Vehicle(0, "imei", 1, "Demo105", 95, 0, 0, 0)); allVehicles.add(new Vehicle(0, "imei", 1, "Demo106", 118, 0, 0, 0)); allVehicles.add(new Vehicle(0, "imei", 1, "Demo107", 111, 0, 0, 0)); return allVehicles; } // get all users public ArrayList getAllSMS() { ArrayList allSMS = new ArrayList(); Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { cursor = database.rawQuery("SELECT _id, timeGMT, imei_sour, imei_dest, mess, status from SMS",new String [] {}); cursor.moveToFirst(); while (cursor.isAfterLast() == false) { SMS sms = new SMS();//cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getInt(5), cursor.getInt(6)); sms.idx =cursor.getInt(0); sms.timeGMT = cursor.getInt(1); sms.sc_id_sour = cursor.getInt(2); sms.sc_id_dest = cursor.getInt(3); sms.mess = cursor.getString(4); sms.status = cursor.getInt(5); sms.seq_idx = ""; allSMS.add(sms); // move to next record cursor.moveToNext(); } cursor.close(); } return allSMS; } public ArrayList getSMS_4Imei(long imei) { ArrayList allSMS = new ArrayList(); Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { cursor = database.rawQuery("SELECT _id, timeGMT, imei_sour, imei_dest, mess, status from SMS where imei_sour ="+imei+" OR imei_dest ="+imei+" ORDER BY timeGMT ASC",new String [] {}); cursor.moveToFirst(); while (cursor.isAfterLast() == false) { SMS sms = new SMS(); sms.idx =cursor.getInt(0); sms.timeGMT = cursor.getInt(1); sms.sc_id_sour = cursor.getInt(2); sms.sc_id_dest = cursor.getInt(3); sms.mess = cursor.getString(4); sms.status = cursor.getInt(5); sms.seq_idx = ""; allSMS.add(sms); // move to next record cursor.moveToNext(); } cursor.close(); } return allSMS; } @SuppressWarnings({ "unchecked", "rawtypes" }) public ArrayList getAllLastSMS() { ArrayList allLastSMS = new ArrayList(); Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { ArrayList imeis= new ArrayList(); cursor = database.rawQuery("SELECT B.imei FROM (SELECT DISTINCT imei_sour AS imei FROM SMS WHERE imei_sour>0 UNION SELECT DISTINCT imei_dest AS imei FROM SMS WHERE imei_dest>0) AS B",new String [] {}); cursor.moveToFirst(); while (cursor.isAfterLast() == false) { /* Integer imei_sour =cursor.getInt(0); Integer imei_dest = cursor.getInt(1); if(imei_sour != 0) if(!imeis.contains(imei_sour)) { imeis.add(imei_sour); } if(imei_dest != 0) if(!imeis.contains(imei_dest)) { imeis.add(imei_dest); } */ imeis.add(cursor.getInt(0)); // move to next record cursor.moveToNext(); } cursor.close(); for(Integer imei:imeis) { ArrayList smss = getSMS_4Imei(imei); if(smss.size() > 0) allLastSMS.add(smss.get(smss.size() - 1)); } Collections.sort(allLastSMS, new Comparator(){ public int compare(Object o1, Object o2) { SMS sms1 = (SMS) o1; SMS sms2 = (SMS) o2; if(sms1.timeGMT < sms2.timeGMT) return -1; else if (sms1.timeGMT > sms2.timeGMT) return 1; else return 0; // return sms1.timeGMT.compareToIgnoreCase(p2.getFirstName()); } }); } return allLastSMS; } public boolean insertSMS(SMS sms) { long id = -1; if(database == null) SM.Debug("DBQuery","Database is null"); else { ContentValues values = new ContentValues(); values.put("timeGMT", sms.timeGMT); values.put("imei_sour", sms.sc_id_sour); values.put("imei_dest", sms.sc_id_dest); values.put("mess", sms.mess); values.put("status", sms.status); id = database.insert("SMS", "", values); //.rawQuery("SELECT imei_sour, imei_dest from SMS",new String [] {}); SM.Debug("DBQuery","Database Insert result: " + id); } //INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1) return (id == -1)? false: true; } // get all users public ArrayList getAllRecordings() { ArrayList allRecordings = new ArrayList(); Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { cursor = database.rawQuery("SELECT _id, id_sour, id_dest, date, duration, filename, type from Recordings order by _id desc",new String [] {}); cursor.moveToFirst(); while (cursor.isAfterLast() == false) { Recording rec = new Recording(); rec.id =cursor.getInt(0); rec.sourceRadioID = cursor.getInt(1); rec.destinationRadioID = cursor.getInt(2); rec.date = cursor.getInt(3); rec.duration = cursor.getInt(4); rec.filename = cursor.getString(5); rec.type = cursor.getInt(6); allRecordings.add(rec); // move to next record cursor.moveToNext(); } cursor.close(); } return allRecordings; } // get all users public Recording getLastRecording() { Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { cursor = database.rawQuery("SELECT _id, id_sour, id_dest, date, duration, filename, type from Recordings order by _id desc",new String [] {}); cursor.moveToFirst(); if(cursor.getCount() > 0) { Recording rec = new Recording(); rec.id =cursor.getInt(0); rec.sourceRadioID = cursor.getInt(1); rec.destinationRadioID = cursor.getInt(2); rec.date = cursor.getInt(3); rec.duration = cursor.getInt(4); rec.filename = cursor.getString(5); rec.type = cursor.getInt(6); return rec; } } return null; } public long insertRecording(Recording rec) { long id = -1; if(database == null) SM.Debug("Database is null"); else { ContentValues values = new ContentValues(); values.put("id_sour", rec.sourceRadioID); values.put("id_dest", rec.destinationRadioID); values.put("date", rec.date); values.put("duration", rec.duration); values.put("filename", rec.filename); values.put("type", rec.type); id = database.insert("Recordings", "", values); //.rawQuery("SELECT imei_sour, imei_dest from SMS",new String [] {}); SM.Debug("DBQuery","Database Insert result: " + id); } //INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1) return id; } public boolean removeRecording(Recording rec) { long id = -1; if(database == null) SM.Debug("Database is null"); else { ContentValues values = new ContentValues(); values.put("id_sour", rec.sourceRadioID); values.put("id_dest", rec.destinationRadioID); values.put("date", rec.date); values.put("duration", rec.duration); values.put("filename", rec.filename); values.put("type", rec.type); id = database.delete("Recordings", "_id=" + rec.id, null); SM.Debug("DBQuery","Database Remove result: " + id); } //INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1) return (id == -1)? false: true; } // get all Contacts public ArrayList getAllContacts(boolean TRBO) { ArrayList allContacts = new ArrayList(); Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { try { cursor = database.rawQuery("SELECT _id, call_id, name, call_type from contacts order by call_id asc",new String [] {}); if(cursor!=null) { cursor.moveToFirst(); while (cursor.isAfterLast() == false) { Contact contact = new Contact(); contact.id = cursor.getInt(1); contact.name = cursor.getString(2); String type = cursor.getString(3); if(type.equals("Private Call")) contact.contactType = Contact.PRIVATE; else if (type.equals("Group Call")) contact.contactType = Contact.GROUP; allContacts.add(contact); // move to next record cursor.moveToNext(); } cursor.close(); } } catch(Exception ex) { // table doesn't exist so I have to create and populate it createContactsTable(); populateContactsTable(TRBO); } } return allContacts; } // get all Contacts public ArrayList getAllZones(boolean TRBO) { ArrayList allZones = new ArrayList(); Cursor cursor = null; if(database == null) SM.Debug("DBQuery","Database is null"); else { try { cursor = database.rawQuery("SELECT _id, position, name, type, zone_id from zonechannel order by zone_id asc, type desc",new String [] {}); if(cursor!=null) { cursor.moveToFirst(); ArrayList listChannels = new ArrayList(); while (cursor.isAfterLast() == false) { // add zone to list if(cursor.getString(3).equals("zone")) { Zone z = new Zone(); z.channelList = new ArrayList(); z.dbID = cursor.getInt(1); z.ZoneName = cursor.getString(2); z.id = cursor.getInt(4); // add channels to zone z.channelList = listChannels; // clear channels list listChannels = new ArrayList(); // add zone allZones.add(z); } else { // add channel to corresponding list Channel c = new Channel(); c.id = cursor.getInt(1); c.chName = cursor.getString(2); c.id = cursor.getInt(1); // add channel to zone if exists or add it to the list for(Zone zone: allZones) { // if channel is in this zone if(zone.id == cursor.getInt(4)) { // create list if not exists if(zone.channelList == null) zone.channelList = new ArrayList(); // add channel to list; zone.channelList.add(c); } } } // move to next record cursor.moveToNext(); } cursor.close(); } } catch(Exception ex) { // table doesn't exist so I have to create and populate it createZoneChannelTable(); populateZoneChannelTable(TRBO); } } return allZones; } public void writeConfigFileZonesAndChannels(ArrayList zones) { // delete all values from zonechannel table database.execSQL("DELETE FROM zonechannel where 1=1"); for(Zone zone:zones) { // insert zone into database database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (" + zone.id + ",'" + zone.ZoneName + "'," + "'zone'" + "," + zone.id + ")"); // add channels for current zone for(Channel ch: zone.channelList) { database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (" + ch.id + ",'" + ch.chName + "'," + "'channel'" + "," + ch.id + ")"); } } } public void writeConfigFileContacts(ArrayList contacts) { // delete all values from contacts table database.execSQL("DELETE FROM contacts where 1=1"); for(Contact contact: contacts) { // insert contact into database database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (" + contact.id + ",'" + contact.name +"','" + contact.contactType + "')"); } } public void createZoneChannelTable() { // create table String sqlDataStore = "create table if not exists " + "zonechannel" + " ("+ BaseColumns._ID + " integer primary key autoincrement," + "position" + " INTEGER ," + "name" + " text not null," + "type" + " text not null," + "zone_id" + " INTEGER not null)"; database.execSQL(sqlDataStore); } public void populateZoneChannelTable(boolean TRBO) { // populate table if(TRBO) { database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Zone1','zone',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Channel1','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (2,'Channel2','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (3,'Channel3','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (4,'Channel4','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (5,'Channel5','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (6,'Channel6','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (3,'Zone2','zone',3)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Ch5[Z2]','channel',3)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (2,'Ch6[Z2]','channel',3)"); } else { database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (1,'Zone1','zone',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (456,'DMO TG1','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (457,'DMO TG2','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (458,'DMO TG3','channel',1)"); database.execSQL("INSERT INTO zonechannel (position, name, type, zone_id) VALUES (459,'DMO TG4','channel',1)"); } } public void createContactsTable() { // create table String sqlDataStore = "create table if not exists " + "contacts" + " ("+ BaseColumns._ID + " integer primary key autoincrement," + "call_id" + " INTEGER ," + "name" + " text not null," + "call_type" + " text not null)"; database.execSQL(sqlDataStore); } public void populateContactsTable(boolean TRBO) { if(TRBO) { database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (101,'UNIT101','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (102,'UNIT102','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (103,'UNIT103','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (104,'BASE104','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (114,'BASE114','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (124,'BASE124','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (1,'Call1','Group Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (2,'Call2','Group Call')"); } else { database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (101,'UNIT101','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (102,'UNIT102','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (103,'UNIT103','Private Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (456,'DMO TG1','Group Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (457,'DMO TG2','Group Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (458,'DMO TG3','Group Call')"); database.execSQL("INSERT INTO contacts (call_id, name, call_type) VALUES (459,'DMO TG4','Group Call')"); } } public long insertContact(Contact contact) { long id = -1; if(database == null) SM.Debug("Database is null"); else { try { ContentValues values = new ContentValues(); values.put("call_id", contact.id); values.put("name", contact.name); values.put("call_type", contact.contactType); id = database.insert("contacts", "", values); //.rawQuery("SELECT imei_sour, imei_dest from SMS",new String [] {}); SM.Debug("DBQuery","Database Insert result: " + id); } catch(Exception ex) { SM.Exception("DB[Insert Contact]","Could not insert into DB"); } } //INSERT into SMS (timeGMT, imei_sour, imei_dest, mess, status) VALUES( 1324016412, 0, 101, 'two', 1) return id; } }