diff --git a/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/DatabaseActionsActivity.java b/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/DatabaseActionsActivity.java index 03bb71852efc46942f79ca1fa8874ba526870234..5b74ce17a280a6a1a1aaacd359cfcd92ef638559 100644 --- a/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/DatabaseActionsActivity.java +++ b/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/DatabaseActionsActivity.java @@ -15,11 +15,13 @@ import android.os.Bundle; import android.preference.PreferenceManager; import android.text.Editable; import android.text.TextWatcher; +import android.text.format.Formatter; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.TextView; import android.widget.Toast; import java.sql.Connection; @@ -30,6 +32,7 @@ import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Locale; @@ -43,6 +46,7 @@ public class DatabaseActionsActivity extends Activity { private String uname, database, pass, host, pNum; public static String trip, url; public static int tripID, downloadColumnCount = 0, uploadColumnCount = 0; + private TextView cleanTV, uploadTV, downloadTV, dbSizeTV, dbStatusTV; public String[] tripArray, tripIds; Resources res; View button; @@ -70,14 +74,26 @@ public class DatabaseActionsActivity extends Activity { settings= PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); editor = settings.edit(); - for (String table : ReadingsDatabase.tables){ + for (String table : ReadingsDatabase.tables) { downloadColumnCount += db.getColumns(table).length; } - for (String table : uploadTables){ + for (String table : uploadTables) { uploadColumnCount += db.getColumns(table).length; } + dbSizeTV = (TextView) findViewById(R.id.databaseSize); + dbSizeTV.setText(String.format(res.getString(R.string.databaseSize), Formatter.formatFileSize(this, db.getSize()))); + dbStatusTV = (TextView) findViewById(R.id.databaseStatus); + dbStatusTV.setText(String.format(res.getString(R.string.databaseStatus), "")); + getDatabaseStatus(db.getStatus()); + cleanTV = (TextView) findViewById(R.id.lastClean); + cleanTV.setText(String.format(res.getString(R.string.lastClean), settings.getString("lastClean", ""))); + uploadTV = (TextView) findViewById(R.id.lastUpload); + uploadTV.setText(String.format(res.getString(R.string.lastUpload), settings.getString("lastUpload", ""))); + downloadTV = (TextView) findViewById(R.id.lastDownload); + downloadTV.setText(String.format(res.getString(R.string.lastDownload), settings.getString("lastDownload", ""))); + dbName = (EditText) findViewById(R.id.database); database = settings.getString("database_name", null); dbName.setText(settings.getString("database_name", "")); @@ -244,6 +260,9 @@ public class DatabaseActionsActivity extends Activity { if(db.copyDatabase("archive")){ makeToast("Cleaned local database."); db.cleanDatabase(); + editor.putString("lastClean", getTimestamp()); + cleanTV.setText(String.format(res.getString(R.string.lastClean), getTimestamp())); + editor.apply(); } } else { new connectToDB().execute(); } @@ -416,6 +435,11 @@ public class DatabaseActionsActivity extends Activity { } protected void onPostExecute(Boolean result) { + if (result) { + editor.putString("lastDownload", getTimestamp()); + downloadTV.setText(String.format(res.getString(R.string.lastDownload), getTimestamp())); + editor.apply(); + } progressDialog.dismiss(); } } @@ -562,8 +586,13 @@ public class DatabaseActionsActivity extends Activity { else if (result) { if(db.copyDatabase("archive")){ db.cleanDatabase(); + editor.putString("lastClean", getTimestamp()); + cleanTV.setText(String.format(res.getString(R.string.lastClean), getTimestamp())); editor.putString("trip", ""); } + editor.putString("lastUpload", getTimestamp()); + uploadTV.setText(String.format(res.getString(R.string.lastUpload), getTimestamp())); + editor.apply(); makeToast("Successfully uploaded tables."); } progressDialog.dismiss(); @@ -576,4 +605,31 @@ public class DatabaseActionsActivity extends Activity { t.setGravity(Gravity.CENTER, 0, 0); t.show(); } + + public String getTimestamp(){ + SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); + return s.format(new Date()); + } + + public void getDatabaseStatus(int status){ + switch(status){ + case 0: + dbStatusTV.setText(String.format(res.getString(R.string.databaseStatus), "Empty")); + break; + case 1: + dbStatusTV.setText(String.format(res.getString(R.string.databaseStatus), "Initialized, readings table populated.")); + break; + case 2: + dbStatusTV.setText(String.format(res.getString(R.string.databaseStatus), "Initialized, readings and streamings table populated.")); + break; + case 3: + dbStatusTV.setText(String.format(res.getString(R.string.databaseStatus), "Initialized, no readings or streaming data.")); + break; + case 4: + dbStatusTV.setText(String.format(res.getString(R.string.databaseStatus), "Initialized, streamings table populated.")); + break; + default: + break; + } + } } diff --git a/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/ReadingsDatabase.java b/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/ReadingsDatabase.java index 97f4355cb4ba2bbedc165acc7350008ea5c78cbe..10a65dce1eadc863e30e257a43f51d5d4f594d8c 100644 --- a/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/ReadingsDatabase.java +++ b/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/ReadingsDatabase.java @@ -8,6 +8,7 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.os.Environment; +import android.util.Log; import java.io.File; import java.io.FileInputStream; @@ -420,7 +421,7 @@ public class ReadingsDatabase extends SQLiteOpenHelper { String[] columns = {"sectorName"}; Cursor c = db.query(T_SECTOR, columns, null, null, null, null, null); List<String> values = new ArrayList<String>(); - while (c.moveToNext()){ + while (c.moveToNext()) { values.add(c.getString(c.getColumnIndex("sectorName"))); } c.close(); @@ -432,13 +433,43 @@ public class ReadingsDatabase extends SQLiteOpenHelper { String[] columns = {"siteName"}; Cursor c = db.query(T_SITE, columns, null, null, null, null, null); List<String> values = new ArrayList<String>(); - while (c.moveToNext()){ + while (c.moveToNext()) { values.add(c.getString(c.getColumnIndex("siteName"))); } c.close(); return values; } + public long getSize() { + return dbPath.length(); + } - + public int getStatus() { + int readings = query(T_READING, null, null).getCount(); + Log.d("ReadingsDatabase", "Readings Counts:" + Integer.toString(readings)); + int streaming = query(T_STREAM, null, null).getCount(); + Log.d("ReadingsDatabase", "Streamings Counts:" + Integer.toString(streaming)); + + // Empty database + if (getSize() == 0){ + return 0; + } else if (getSites().size() != 0) { + if (readings != 0) { + if (streaming == 0) { + // Just readings populated + return 1; + } else { + return 2; + } + } else { + if (streaming != 0) { + return 4; + } else { + return 3; + } + // Initialized but no readings + } + } + return 0; + } } diff --git a/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/SensorSampleService.java b/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/SensorSampleService.java index 398305620d6a7438f4d474e7b3b04ddb6dc3982f..1fc2af1efea8a2f92434ee3a06ecf0d579998ad2 100644 --- a/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/SensorSampleService.java +++ b/app/src/main/java/fieldscience/cs/earlham/edu/fieldday/SensorSampleService.java @@ -214,7 +214,7 @@ public class SensorSampleService extends Service implements SensorEventListener mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Sampling wake lock"); mWakeLock.acquire(); - if (sampleOnce){ + if (sampleOnce) { writeToDB(); } else { dbHandler.postDelayed(dbRunner, loggingInterval); diff --git a/app/src/main/res/layout/activity_connectdb.xml b/app/src/main/res/layout/activity_connectdb.xml index 97617ba7e2e1d9c4d7178fcada29bdc9485aec69..f3a008303acab2b00caa60aabd32307586fe8277 100644 --- a/app/src/main/res/layout/activity_connectdb.xml +++ b/app/src/main/res/layout/activity_connectdb.xml @@ -10,8 +10,11 @@ android:hint="@string/server_ip" android:layout_marginTop="31dp" android:layout_alignParentTop="true" + android:singleLine="true" android:textColorHint="@color/dark_gray_blue" android:textColor="@color/dark_gray_blue" + android:layout_alignStart="@id/serverIp" + android:layout_alignEnd="@id/serverIp" android:textCursorDrawable="@null" android:layout_centerHorizontal="true" /> @@ -23,7 +26,10 @@ android:textColorHint="@color/dark_gray_blue" android:textColor="@color/dark_gray_blue" android:textCursorDrawable="@null" + android:singleLine="true" android:hint="@string/database_name" + android:layout_alignStart="@id/serverIp" + android:layout_alignEnd="@id/serverIp" android:layout_below="@+id/serverIp" android:layout_centerHorizontal="true" /> @@ -35,6 +41,9 @@ android:textColor="@color/dark_gray_blue" android:textCursorDrawable="@null" android:text="" + android:singleLine="true" + android:layout_alignStart="@id/serverIp" + android:layout_alignEnd="@id/serverIp" android:hint="@string/username" android:layout_below="@+id/database" android:layout_centerHorizontal="true" /> @@ -48,6 +57,9 @@ android:hint="@string/password" android:textColorHint="@color/dark_gray_blue" android:textColor="@color/dark_gray_blue" + android:layout_alignStart="@id/serverIp" + android:singleLine="true" + android:layout_alignEnd="@id/serverIp" android:textCursorDrawable="@null" android:layout_below="@+id/username" android:layout_centerHorizontal="true" /> @@ -61,6 +73,9 @@ android:textColor="@color/dark_gray_blue" android:textCursorDrawable="@null" android:hint="@string/port_of_db" + android:layout_alignStart="@id/serverIp" + android:layout_alignEnd="@id/serverIp" + android:singleLine="true" android:fontFamily="sans-serif" android:layout_below="@+id/password" android:layout_centerHorizontal="true" /> @@ -70,26 +85,79 @@ android:layout_height="wrap_content" android:text="@string/connect" android:id="@+id/setupDbButton" - android:layout_marginTop="77dp" - android:layout_below="@id/port" - android:layout_toStartOf="@+id/uploadButton" - android:layout_marginEnd="67dp" /> + android:layout_below="@+id/port" + android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/upload" android:id="@+id/uploadButton" - android:layout_alignTop="@id/setupDbButton" - android:layout_toEndOf="@id/port" /> + android:layout_alignTop="@+id/setupDbButton" + android:layout_toStartOf="@+id/database" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/wipeDB" android:id="@+id/wipeDatabase" - android:layout_centerVertical="true" - android:layout_alignEnd="@+id/username" /> + android:layout_alignTop="@+id/setupDbButton" + android:layout_toEndOf="@+id/database" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/lastUpload" + android:id="@+id/lastUpload" + android:layout_alignStart="@id/uploadButton" + android:textColor="@color/dark_gray_blue" + android:textAppearance="@android:style/TextAppearance.Medium" + android:textStyle="bold" + android:layout_above="@+id/lastDownload" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/lastDownload" + android:id="@+id/lastDownload" + android:textAppearance="@android:style/TextAppearance.Medium" + android:textColor="@color/dark_gray_blue" + android:textStyle="bold" + android:layout_above="@+id/lastClean" + android:layout_alignStart="@+id/lastUpload" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/lastClean" + android:id="@+id/lastClean" + android:textAppearance="@android:style/TextAppearance.Medium" + android:textStyle="bold" + android:textColor="@color/dark_gray_blue" + android:layout_alignStart="@id/lastUpload" + android:layout_above="@+id/databaseSize" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/databaseSize" + android:id="@+id/databaseSize" + android:textAppearance="@android:style/TextAppearance.Medium" + android:textStyle="bold" + android:textColor="@color/dark_gray_blue" + android:layout_above="@+id/databaseStatus" + android:layout_alignStart="@id/lastUpload" /> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/databaseStatus" + android:id="@+id/databaseStatus" + android:textAppearance="@android:style/TextAppearance.Medium" + android:textStyle="bold" + android:textColor="@color/dark_gray_blue" + android:layout_alignParentBottom="true" + android:layout_alignStart="@id/lastUpload" + android:layout_marginBottom="25dp" /> </RelativeLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 428ac8614f0b2a390e63c56d82b3ad995d0efa4f..6e06a49c51ad45622daf3f665ec09582ec52bb07 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -81,12 +81,17 @@ <string name="password">Password of user to connect with</string> <string name="port_of_db">Port to connect to</string> <string name="default_port">5432</string> - <string name="connect">Set up local database</string> + <string name="connect">Setup local database</string> <string name="upload">Upload tables</string> <string name="spotQuery">select count(*) as rowcount from fieldday_spot where tripID = %1$s and siteID = %2$s and sectorID = %3$s and spotID = %4$s;</string> <string name="cannot_connect">Cannot connect. Make sure to fill out all of your information.</string> <string name="wipeDB">Clear local database</string> <string name="updateDB">Update local database</string> + <string name="lastUpload">Last upload of tables: "%1$s"</string> + <string name="lastDownload">Last setup of local database: "%1$s"</string> + <string name="lastClean">Last clear of local database: "%1$s"</string> + <string name="databaseSize">Current database size: "%1$s"</string> + <string name="databaseStatus">Current database status: "%1$s"</string> <!-- My Documents strings --> <string name="fileHost">URL of server where the files are hosted.</string>