package com.github.andlyticsproject.io;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.BigTextStyle;
import android.support.v4.app.NotificationCompat.Builder;
import android.util.Log;
import com.github.andlyticsproject.ContentAdapter;
import com.github.andlyticsproject.Preferences.Timeframe;
import com.github.andlyticsproject.R;
import com.github.andlyticsproject.model.AppStatsSummary;
import com.github.andlyticsproject.util.FileUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipOutputStream;
public class ExportService extends IntentService {
private static final String TAG = ExportService.class.getSimpleName();
public static final int NOTIFICATION_ID_PROGRESS = 1;
public static final int NOTIFICATION_ID_FINISHED = 1;
public static final String EXTRA_PACKAGE_NAMES = "packageNames";
public static final String EXTRA_ACCOUNT_NAME = "accountName";
private boolean errors = false;
private String[] packageNames;
private String accountName;
private NotificationManager notificationManager;
public ExportService() {
super("andlytics ExportService");
}
@Override
public void onCreate() {
super.onCreate();
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d(TAG, "export service onStartCommand");
this.packageNames = intent.getStringArrayExtra(EXTRA_PACKAGE_NAMES);
Log.d(TAG, "package names:: " + packageNames);
this.accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
Log.d(TAG, "account name:: " + accountName);
boolean success = exportStats();
notifyExportFinished(success);
}
private boolean exportStats() {
String message = getApplicationContext().getString(R.string.export_started);
sendNotification(message);
File dir = StatsCsvReaderWriter.getExportDir();
if (!dir.exists()) {
dir.mkdirs();
}
try {
File zipFile = StatsCsvReaderWriter.getExportFileForAccount(accountName);
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipFile));
StatsCsvReaderWriter statsWriter = new StatsCsvReaderWriter(this);
ContentAdapter db = ContentAdapter.getInstance(getApplication());
try {
for (int i = 0; i < packageNames.length; i++) {
AppStatsSummary statsForApp = db.getStatsForApp(packageNames[i],
Timeframe.UNLIMITED, false);
statsWriter.writeStats(packageNames[i], statsForApp.getStats(), zip);
}
} catch (IOException e) {
Log.e(TAG, "Zip error, deleting incomplete file.", e);
zipFile.delete();
} finally {
zip.close();
}
FileUtils.scanFile(this, zipFile.getAbsolutePath());
} catch (IOException e) {
Log.e(TAG, "Error zipping CSV files: " + e.getMessage(), e);
return false;
}
return !errors;
}
private void notifyExportFinished(boolean success) {
// clear progress notification
notificationManager.cancel(NOTIFICATION_ID_PROGRESS);
Intent shareIntent = createShareIntent();
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
shareIntent, PendingIntent.FLAG_UPDATE_CURRENT);
String message = getApplicationContext().getString(R.string.export_saved_to) + ": "
+ StatsCsvReaderWriter.getExportDirPath();
String title = getResources().getString(R.string.app_name) + ": "
+ getApplicationContext().getString(R.string.export_finished);
Builder builder = new NotificationCompat.Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.statusbar_andlytics);
builder.setContentTitle(title);
builder.setContentText(message);
BigTextStyle style = new BigTextStyle(builder);
style.bigText(message);
style.setBigContentTitle(title);
style.setSummaryText(accountName);
builder.setStyle(style);
builder.setContentIntent(pendingIntent);
builder.setWhen(System.currentTimeMillis());
builder.setDefaults(Notification.DEFAULT_ALL);
builder.setAutoCancel(true);
builder.setOngoing(false);
builder.addAction(android.R.drawable.ic_menu_share,
getApplicationContext().getString(R.string.share), pendingIntent);
notificationManager.notify(NOTIFICATION_ID_FINISHED, builder.build());
}
private Intent createShareIntent() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("application/zip");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
File zipFile = StatsCsvReaderWriter.getExportFileForAccount(accountName);
intent.putExtra(Intent.EXTRA_STREAM, android.net.Uri.parse(zipFile.getAbsolutePath()));
return Intent.createChooser(intent, (getString(R.string.share)));
}
/**
* Send a notification to the progress bar.
*/
protected void sendNotification(String message) {
Intent startActivityIntent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
startActivityIntent, 0);
Builder builder = new NotificationCompat.Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.statusbar_andlytics);
builder.setContentTitle(getResources().getString(R.string.app_name) + ": "
+ getApplicationContext().getString(R.string.export_));
builder.setContentText(message);
builder.setContentIntent(pendingIntent);
builder.setDefaults(0);
builder.setAutoCancel(true);
builder.setOngoing(true);
notificationManager.notify(NOTIFICATION_ID_PROGRESS, builder.build());
}
}