package uk.org.smithfamily.mslogger.activity; import java.io.File; import java.io.FilenameFilter; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import uk.org.smithfamily.mslogger.ApplicationSettings; import uk.org.smithfamily.mslogger.R; import uk.org.smithfamily.mslogger.log.DatalogRow; import uk.org.smithfamily.mslogger.log.DatalogRowAdapter; import uk.org.smithfamily.mslogger.log.DatalogRowAdapterCallback; import uk.org.smithfamily.mslogger.log.DebugLogManager; import uk.org.smithfamily.mslogger.log.EmailManager; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.os.StatFs; import android.text.format.Formatter; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; /** * Activity class used to manage datalogs */ public class ManageDatalogsActivity extends ListActivity { private ListView datalogsList; private TextView datalogsInfo; private DatalogRowAdapter mDatalogsArrayAdapter; private Button view; private Button sendByEmail; private Button delete; /** * Creation of the activity, fill the datalogs listview with the current datalog on the device * * @param savedInstanceState */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.managedatalogs); setTitle(R.string.manage_datalogs_title); datalogsInfo = (TextView) findViewById(R.id.datalogs_info); view = (Button) findViewById(R.id.view); view.setVisibility(View.GONE); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Find selected datalog String datalog = ""; String datalogDirectory = ApplicationSettings.INSTANCE.getDataDir().getAbsolutePath(); List<DatalogRow> selectedRows = ((DatalogRowAdapter) datalogsList.getAdapter()).getAllSelected(); if (selectedRows.size() > 0) { DatalogRow firstSelectedRow = selectedRows.get(0); datalog = datalogDirectory + "/" + firstSelectedRow.getDatalogName(); } Intent launchViewDatalog = new Intent(ManageDatalogsActivity.this, ViewDatalogActivity.class); Bundle b = new Bundle(); b.putString("datalog",datalog); launchViewDatalog.putExtras(b); startActivity(launchViewDatalog); } }); sendByEmail = (Button) findViewById(R.id.send_by_email); sendByEmail.setVisibility(View.GONE); sendByEmail.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { List<String> paths = new ArrayList<String>(); // Create array of datalogs path to send String datalogDirectory = ApplicationSettings.INSTANCE.getDataDir().getAbsolutePath(); List<DatalogRow> selectedRows = ((DatalogRowAdapter) datalogsList.getAdapter()).getAllSelected(); for (DatalogRow datalogRow : selectedRows) { paths.add(datalogDirectory + "/" + datalogRow.getDatalogName()); } String emailText = getString(R.string.email_body); String subject = String.format(getString(R.string.email_subject), System.currentTimeMillis()); EmailManager.email(ManageDatalogsActivity.this, ApplicationSettings.INSTANCE.getEmailDestination(), null, subject, emailText, paths); } }); delete = (Button) findViewById(R.id.delete); delete.setVisibility(View.GONE); delete.setOnClickListener(new OnClickListener () { @Override public void onClick(View v) { // Create array of datalogs path to delete List<String> datalogsToDelete = new ArrayList<String>(); String datalogDirectory = ApplicationSettings.INSTANCE.getDataDir().getAbsolutePath(); List<DatalogRow> selectedRows = ((DatalogRowAdapter) datalogsList.getAdapter()).getAllSelected(); for (DatalogRow datalogRow : selectedRows) { datalogsToDelete.add(datalogDirectory + "/" + datalogRow.getDatalogName()); } for (String datalogFilepath : datalogsToDelete) { // Physically delete the file File fileToDelete = new File(datalogFilepath); boolean deleteResult = fileToDelete.delete(); if (!deleteResult) { DebugLogManager.INSTANCE.log("Couldn't delete " + datalogFilepath,Log.ERROR); } } // Clear the adapter mDatalogsArrayAdapter.clear(); // Refill datalogs listview fillDatalogsListView(); } }); fillDatalogsListView(); } /** * Prepare the listview for datalogs */ private void fillDatalogsListView() { datalogsList = (ListView) findViewById(android.R.id.list); datalogsList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); datalogsList.setItemsCanFocus(true); File datalogDirectory = ApplicationSettings.INSTANCE.getDataDir(); class DatalogFilter implements FilenameFilter { public boolean accept(File dir, String name) { return name.endsWith(".msl"); } } File[] datalogs = datalogDirectory.listFiles(new DatalogFilter()); if (datalogs.length > 0) { ArrayList<DatalogRow> datalogRows = new ArrayList<DatalogRow>(); long datalogsSize = 0; for (File datalog : datalogs) { DatalogRow datalogRow = new DatalogRow(); datalogRow.setDatalogName(datalog.getName()); datalogRow.setDatalogSize("Size: " + Formatter.formatFileSize(this, datalog.length())); datalogRows.add(datalogRow); datalogsSize += datalog.length(); } mDatalogsArrayAdapter = new DatalogRowAdapter(this, datalogRows); mDatalogsArrayAdapter.setCallback(new DatalogRowAdapterCallback() { public void onDatalogSelected() { // If more then one datalog is checked, make send by email button visible if (getCountDatalogsChecked() > 0) { showBottomButtons(); } else { hideBottomButtons(); } } }); datalogsList.setAdapter(mDatalogsArrayAdapter); datalogsList.setVisibility(View.VISIBLE); // Datalogs stats StatFs stat = new StatFs(ApplicationSettings.INSTANCE.getDataDir().getPath()); BigInteger blockCount = BigInteger.valueOf(stat.getBlockCount()); BigInteger blockSize = BigInteger.valueOf(stat.getBlockSize()); long totalSize = blockCount.multiply(blockSize).longValue(); String datalogsSizeFormatted = Formatter.formatFileSize(this, datalogsSize); String internalSizeFormatted = Formatter.formatFileSize(this, totalSize); String datalogText = "datalog"; String datalogUpperText = "Datalog"; if (datalogs.length == 0 || datalogs.length > 1) { datalogText += "s"; datalogUpperText += "s"; } datalogsInfo.setText("Currently " + datalogs.length + " " + datalogText + " / " + datalogUpperText + " size: " + datalogsSizeFormatted + " / " + internalSizeFormatted); } // No datalog found, showing message instead else { datalogsInfo.setText(R.string.no_datalog_found); datalogsList.setVisibility(View.GONE); // Make the three bottom buttons dissapear too hideBottomButtons(); } } /** * @return The number of checked datalogs */ private int getCountDatalogsChecked() { int nbChecked = 0; for (int i = 0; i < datalogsList.getAdapter().getCount(); i++) { if (((DatalogRowAdapter) datalogsList.getAdapter()).isItemSelected(i)) { nbChecked++; } } return nbChecked; } /** * Show the bottom buttons */ private void showBottomButtons() { sendByEmail.setVisibility(View.VISIBLE); delete.setVisibility(View.VISIBLE); if (getCountDatalogsChecked() == 1) { view.setVisibility(View.VISIBLE); } else { view.setVisibility(View.GONE); } } /** * Hide the bottoms buttons */ private void hideBottomButtons() { view.setVisibility(View.GONE); sendByEmail.setVisibility(View.GONE); delete.setVisibility(View.GONE); } }