package com.tierep.notificationanalyser.models;
import android.content.Context;
import android.util.Log;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.j256.ormlite.table.TableUtils;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
/**
* This utility class can be used to generate demo data.
* Data is generated for the last 30 days, for a total of 500 notifications distributed random over
* packages of some common apps.
*
* For displaying the data correctly in the app, it is required that these common apps are installed.
*
* Created by pieter on 04/10/14.
*/
public class DemoDataGenerator {
private Context context = null;
private DatabaseHelper databaseHelper = null;
private List<AppMock> apps = new ArrayList<AppMock>();
private List<Date> dates = new ArrayList<Date>();
private Random random = new Random();
private boolean hasGenerated = false;
private int notificationsAmount = 500;
private List<Integer> dayToSkip = Arrays.asList(3, 4, 5, 6, 7, 8, 9);
private List<Integer> monthToSkip = Arrays.asList(10);
public DemoDataGenerator(Context context) {
this.context = context;
List<String> names = Arrays.asList("Maurice Cooper", "Jack Jaida", "Kinley Russell",
"Nicky Izabelle", "Jerry Brooks", "Julyan Bella", "Ami Percival", "Larry Page",
"Sergey Brin", "Eric Schmidt", "Mark Zuckerberg", "Marissa Mayer");
List<String> empty = new LinkedList<String>();
empty.add(null);
apps.add(new AppMock(new Application("com.google.android.talk", false), names));
apps.add(new AppMock(new Application("com.whatsapp", false), names));
apps.add(new AppMock(new Application("com.facebook.orca", false), names));
apps.add(new AppMock(new Application("com.facebook.katana", false), empty));
apps.add(new AppMock(new Application("com.instagram.android", false), empty));
apps.add(new AppMock(new Application("com.twitter.android", false), empty));
apps.add(new AppMock(new Application("com.joelapenna.foursquared", false), empty));
apps.add(new AppMock(new Application("com.google.android.gm", false), empty));
apps.add(new AppMock(new Application("com.google.android.apps.plus", false), empty));
apps.add(new AppMock(new Application("com.snapchat.android", false), empty));
apps.add(new AppMock(new Application("com.soundcloud.android", false), empty));
apps.add(new AppMock(new Application("org.telegram.messenger", false), empty));
apps.add(new AppMock(new Application("com.foursquare.robin", false), empty));
apps.add(new AppMock(new Application("com.linkedin.android", false), empty));
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date.getTime());
cal.set(Calendar.HOUR_OF_DAY, 18);
cal.set(Calendar.MINUTE, 0);
for (int i = 0; i < notificationsAmount; i++) {
cal.add(Calendar.HOUR, random.nextInt(3) * (-1));
cal.add(Calendar.MINUTE, random.nextInt(30));
if (dayToSkip != null && !dayToSkip.contains(cal.get(Calendar.DAY_OF_MONTH)) && !monthToSkip.contains(cal.get(Calendar.MONTH))){
dates.add(cal.getTime());
}
else{
i--;
}
}
}
public void Generate(boolean emptyFirst) {
if (!hasGenerated) {
try {
ApplicationDao daoApp = getDatabaseHelper().getApplicationDao();
NotificationItemDao daoNtf = getDatabaseHelper().getNotificationDao();
if (emptyFirst) {
TableUtils.clearTable(getDatabaseHelper().getConnectionSource(), Application.class);
TableUtils.clearTable(getDatabaseHelper().getConnectionSource(), NotificationItem.class);
}
for (AppMock app : apps) {
daoApp.create(app.application);
}
for (int i = 0; i < notificationsAmount; i++) {
AppMock a = GenerateApplication();
NotificationItem ntf = new NotificationItem(a.application.getPackageName(), dates.get(i), GenerateApplicationMessage(a));
daoNtf.create(ntf);
}
} catch (SQLException e) {
e.printStackTrace();
}
this.close();
} else {
hasGenerated = true;
}
}
private AppMock GenerateApplication() {
int randomNum = random.nextInt(apps.size());
return apps.get(randomNum);
}
private String GenerateApplicationMessage(AppMock applicationMock) {
int randomNum = random.nextInt(applicationMock.messages.size());
return applicationMock.messages.get(randomNum);
}
private Date GenerateDate() {
int randomNum = random.nextInt(dates.size());
return dates.get(randomNum);
}
private DatabaseHelper getDatabaseHelper() {
if (databaseHelper == null) {
databaseHelper = OpenHelperManager.getHelper(context, DatabaseHelper.class);
}
return databaseHelper;
}
private void close() {
if (databaseHelper != null) {
OpenHelperManager.releaseHelper();
databaseHelper = null;
}
}
private class AppMock {
public Application application;
public List<String> messages;
public AppMock(Application app, List<String> messages) {
this.application = app;
this.messages = messages;
}
}
}