/*
* Copyright (C) 2012 Pixmob (http://github.com/pixmob)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.pixmob.freemobile.netstat.ui;
import static org.pixmob.freemobile.netstat.Constants.TAG;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import org.pixmob.freemobile.netstat.R;
import org.pixmob.freemobile.netstat.content.NetstatContract.Events;
import org.pixmob.freemobile.netstat.util.IOUtils;
import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.widget.Toast;
/**
* Export database to a file on the external storage.
* @author Pixmob
*/
class ExportTask extends AsyncTask<Void, Integer, Boolean> {
private static final String DIALOG_TAG = "export";
private static final String LINE_SEP = "\r\n";
private static final String COL_SEP = ";";
private static final String DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
private final Context context;
private FragmentManager fragmentManager;
private boolean aborted;
public ExportTask(final Context context,
final FragmentManager fragmentManager) {
this.context = context;
this.fragmentManager = fragmentManager;
}
public void setFragmentManager(FragmentManager fragmentManager) {
this.fragmentManager = fragmentManager;
}
@Override
protected Boolean doInBackground(Void... params) {
if (aborted) {
return false;
}
try {
export();
Log.i(TAG, "Export done");
} catch (IOException e) {
Log.e(TAG, "Failed to export database", e);
return false;
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
final ExportDialogFragment f = (ExportDialogFragment) fragmentManager
.findFragmentByTag(DIALOG_TAG);
if (f != null) {
final int current = values[0];
final int total = values[1];
f.update(current, total);
}
}
@Override
protected void onPreExecute() {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Log.w(TAG, "External storage is not available");
Toast.makeText(context,
context.getString(R.string.external_storage_not_available),
Toast.LENGTH_SHORT).show();
aborted = true;
} else {
new ExportDialogFragment().show(fragmentManager, DIALOG_TAG);
}
}
@Override
protected void onPostExecute(Boolean result) {
dismissDialog();
if (result) {
Toast.makeText(context, R.string.export_done, Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(context, R.string.export_error, Toast.LENGTH_SHORT)
.show();
}
}
@Override
protected void onCancelled(Boolean result) {
dismissDialog();
}
private void dismissDialog() {
final DialogFragment f = (DialogFragment) fragmentManager
.findFragmentByTag(DIALOG_TAG);
if (f != null) {
f.dismiss();
}
// Clear reference to avoid memory leaks.
fragmentManager = null;
}
private void export() throws IOException {
final File outputFile = new File(
Environment.getExternalStorageDirectory(),
"freemobilenetstat.csv");
Log.i(TAG, "Exporting database to " + outputFile.getPath());
final DateFormat dateFormatter = new SimpleDateFormat(DATE_FORMAT);
final BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outputFile), "UTF-8"));
final Cursor c = context.getContentResolver().query(
Events.CONTENT_URI,
new String[] { Events.TIMESTAMP, Events.MOBILE_OPERATOR,
Events.MOBILE_CONNECTED, Events.WIFI_CONNECTED,
Events.BATTERY_LEVEL, Events.SCREEN_ON, Events.POWER_ON },
null, null, null);
try {
final int rowCount = c.getCount();
int currentRow = 0;
final StringBuilder buf = new StringBuilder(1024);
buf.append("Timestamp").append(COL_SEP).append("Mobile Operator")
.append(COL_SEP).append("Mobile Connected").append(COL_SEP)
.append("Wi-Fi Connected").append(COL_SEP)
.append("Screen On").append(COL_SEP).append("Battery")
.append(COL_SEP).append("Power On").append(LINE_SEP);
out.write(buf.toString());
while (c.moveToNext()) {
final long t = c.getLong(0);
final String mobOp = c.isNull(1) ? "" : c.getString(1);
final int mobConn = c.getInt(2) == 1 ? 1 : 0;
final int wifiOn = c.getInt(3) == 1 ? 1 : 0;
final int bat = c.getInt(4);
final int screenOn = c.getInt(5) == 1 ? 1 : 0;
final int powerOn = c.getInt(6) == 1 ? 1 : 0;
buf.delete(0, buf.length());
buf.append(dateFormatter.format(t)).append(COL_SEP)
.append(mobOp).append(COL_SEP).append(mobConn)
.append(COL_SEP).append(wifiOn).append(COL_SEP)
.append(screenOn).append(COL_SEP).append(bat)
.append(COL_SEP).append(powerOn).append(LINE_SEP);
out.write(buf.toString());
publishProgress(++currentRow, rowCount);
}
} finally {
IOUtils.close(out);
c.close();
}
}
}