package uk.org.smithfamily.mslogger.dialog;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import uk.org.smithfamily.mslogger.ApplicationSettings;
import uk.org.smithfamily.mslogger.R;
import uk.org.smithfamily.mslogger.comms.MS3SDCard;
import uk.org.smithfamily.mslogger.ecuDef.Megasquirt;
import uk.org.smithfamily.mslogger.log.DatalogRow;
import uk.org.smithfamily.mslogger.log.DatalogRowAdapter;
import uk.org.smithfamily.mslogger.log.DatalogRowAdapterCallback;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
/**
* SD Card console for MS3
*/
public class SDCardConsole extends Dialog implements android.view.View.OnClickListener
{
private Button buttonView;
private Button buttonDownload;
private Button buttonDelete;
private ListView datalogsList;
private DatalogRowAdapter mDatalogsArrayAdapter;
private BroadcastReceiver yourReceiver;
private MS3SDCard sdCard;
public SDCardConsole(Context context)
{
super(context);
this.sdCard = new MS3SDCard();
}
/**
* Constructor
*
* @param savedInstanceState
*/
@Override
public void onCreate(Bundle savedInstanceState)
{
setContentView(R.layout.sd_card_console);
setTitle(R.string.ms3_sd_console);
buttonView = (Button) findViewById(R.id.view);
buttonView.setOnClickListener(this);
buttonDownload = (Button) findViewById(R.id.download);
buttonDownload.setOnClickListener(this);
buttonDelete = (Button) findViewById(R.id.delete);
buttonDelete.setOnClickListener(this);
datalogsList = (ListView) findViewById(android.R.id.list);
final IntentFilter injectCommandResultsFilter = new IntentFilter();
injectCommandResultsFilter.addAction(Megasquirt.INJECTED_COMMAND_RESULTS);
sdCard.status();
this.yourReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (action.equals(Megasquirt.INJECTED_COMMAND_RESULTS))
{
int resultId = intent.getIntExtra(Megasquirt.INJECTED_COMMAND_RESULT_ID, 0);
byte result[] = intent.getByteArrayExtra(Megasquirt.INJECTED_COMMAND_RESULT_DATA);
switch (resultId)
{
case Megasquirt.MS3_SD_CARD_STATUS_READ:
System.out.println("sd card status read: " + Arrays.toString(result));
break;
case Megasquirt.MS3_SD_CARD_STATUS_WRITE:
System.out.println("sd card status write: " + Arrays.toString(result));
break;
case Megasquirt.MS3_SD_CARD_READ_DIRECTORY_WRITE:
break;
case Megasquirt.MS3_SD_CARD_READ_DIRECTORY_READ:
break;
case Megasquirt.MS3_SD_CARD_READ_STREAM:
break;
default:
break;
}
}
}
};
// Registers the receiver so that your service will listen for broadcasts
getContext().registerReceiver(this.yourReceiver, injectCommandResultsFilter);
fillDatalogsListView();
}
/**
* Unregister the broadcast receiver when the dialog is closed
*/
public void onStop()
{
getContext().unregisterReceiver(this.yourReceiver);
}
/**
* TODO: Get from SD card of MS3 instead of android device
*
* Prepare the listview for datalogs
*/
private void fillDatalogsListView()
{
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>();
for (File datalog : datalogs)
{
DatalogRow datalogRow = new DatalogRow();
datalogRow.setDatalogName(datalog.getName());
datalogRow.setDatalogSize("Size: " + Formatter.formatFileSize(getContext(), datalog.length()));
datalogRows.add(datalogRow);
}
mDatalogsArrayAdapter = new DatalogRowAdapter(getContext(), 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);
showBottomButtons();
}
// No datalog found, showing message instead
else
{
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()
{
int datalogCount = getCountDatalogsChecked();
if (datalogCount >= 1)
{
buttonDelete.setVisibility(View.VISIBLE);
}
else
{
buttonDelete.setVisibility(View.GONE);
}
if (datalogCount == 1)
{
buttonView.setVisibility(View.VISIBLE);
buttonDownload.setVisibility(View.VISIBLE);
}
else
{
buttonView.setVisibility(View.GONE);
buttonDownload.setVisibility(View.GONE);
}
}
/**
* Hide the bottoms buttons
*/
private void hideBottomButtons()
{
buttonView.setVisibility(View.GONE);
buttonDownload.setVisibility(View.GONE);
buttonDelete.setVisibility(View.GONE);
}
/**
* @param v The view that was clicked on
*/
@Override
public void onClick(View v)
{
int which = v.getId();
if (which == R.id.view)
{
}
else if (which == R.id.download)
{
}
else if (which == R.id.delete)
{
}
}
}