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.net.Uri; 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.LoginActivity; import com.github.andlyticsproject.R; import com.github.andlyticsproject.model.AppStats; import java.util.Arrays; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ImportService extends IntentService { private static final String TAG = ImportService.class.getSimpleName(); public static final int NOTIFICATION_ID_PROGRESS = 2; public static final int NOTIFICATION_ID_FINISHED = 2; public static final String FILE_NAMES = "fileNames"; public static final String ACCOUNT_NAME = "accountName"; private boolean errors = false; private String accountName; private List<String> fileNames; private Uri zipFileUri; private NotificationManager notificationManager; private Exception error; public ImportService() { super("andlytics ImportService"); } @Override public void onCreate() { super.onCreate(); notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "import service onStartCommand"); this.zipFileUri = intent.getData(); Log.d(TAG, "zip file: " + zipFileUri); this.fileNames = Arrays.asList(intent.getStringArrayExtra(FILE_NAMES)); Log.d(TAG, "file names:: " + fileNames); this.accountName = intent.getStringExtra(ACCOUNT_NAME); Log.d(TAG, "account name:: " + accountName); boolean success = importStats(); notifyImportFinished(success); } private boolean importStats() { String message = getApplicationContext().getString(R.string.import_started); sendNotification(message); ContentAdapter db = ContentAdapter.getInstance(getApplication()); try { StatsCsvReaderWriter statsWriter = new StatsCsvReaderWriter(ImportService.this); ZipInputStream inzip = new ZipInputStream(getContentResolver().openInputStream( zipFileUri)); ZipEntry entry = null; while ((entry = inzip.getNextEntry()) != null) { String filename = entry.getName(); if (!fileNames.contains(filename)) { continue; } List<AppStats> stats = statsWriter.readStats(inzip); if (!stats.isEmpty()) { String packageName = stats.get(0).getPackageName(); message = getApplicationContext().getString(R.string.importing) + " " + packageName; sendNotification(message); for (AppStats appStats : stats) db.insertOrUpdateAppStats(appStats, packageName); } } inzip.close(); } catch (Exception e) { Log.e(TAG, "Error importing stats: " + e.getMessage(), e); error = e; errors = true; } message = getResources().getString(R.string.app_name) + ": " + getApplicationContext().getString(R.string.import_finished); sendNotification(message); return !errors; } private void notifyImportFinished(boolean success) { notificationManager.cancel(NOTIFICATION_ID_PROGRESS); Intent startActivityIntent = new Intent(this, LoginActivity.class); startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT); Builder builder = new NotificationCompat.Builder(getApplicationContext()); builder.setSmallIcon(R.drawable.statusbar_andlytics); builder.setContentIntent(pendingIntent); builder.setWhen(System.currentTimeMillis()); builder.setDefaults(Notification.DEFAULT_ALL); builder.setAutoCancel(true); builder.setOngoing(false); if (success) { String title = getResources().getString(R.string.app_name) + ": " + getApplicationContext().getString(R.string.import_finished); String message = getResources().getString(R.string.imported_apps, fileNames.size()); builder.setContentTitle(title); builder.setContentText(message); BigTextStyle style = new BigTextStyle(builder); style.setBigContentTitle(title); style.bigText(message); style.setSummaryText(accountName); builder.setStyle(style); } else { String title = getResources().getString(R.string.app_name) + ": " + getApplicationContext().getString(R.string.import_error); String message = error.getMessage(); builder.setContentTitle(title); builder.setContentText(message); BigTextStyle style = new BigTextStyle(builder); style.setBigContentTitle(title); style.bigText(message); style.setSummaryText(accountName); builder.setStyle(style); } notificationManager.notify(NOTIFICATION_ID_FINISHED, builder.build()); } /** * 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.import_)); builder.setContentText(message); builder.setContentIntent(pendingIntent); builder.setDefaults(0); builder.setAutoCancel(true); builder.setOngoing(true); notificationManager.notify(NOTIFICATION_ID_PROGRESS, builder.build()); } }