public void GetWebsiteDetailsTest() { // dummy data var dummyList = new List <ArtifactTest>(); dummyList.Add(new ArtifactTest("Your retrospection for the 7/14/2015 - Microsoft Edge", "Microsoft Edge", "Your retrospection for the 7/14/2015")); dummyList.Add(new ArtifactTest("Your retrospection for the 7/15/2015 ?- Microsoft Edge", "Microsoft Edge", "Your retrospection for the 7/15/2015")); dummyList.Add(new ArtifactTest("SiriusXM - Channel Line up - Google Chrome", "chrome", "SiriusXM - Channel Line up")); dummyList.Add(new ArtifactTest("Grant access to Visual Studio Online for Power BI - Internet Explorer", "iexplore", "Grant access to Visual Studio Online for Power BI")); dummyList.Add(new ArtifactTest("Search | King County Library System | BiblioCommons - Mozilla Firefox", "firefox", "Search | King County Library System | BiblioCommons")); dummyList.Add(new ArtifactTest("ProductsWeb - Internet Explorer", "iexplore", "ProductsWeb")); dummyList.Add(new ArtifactTest("(1) WhatsApp Web - Internet Explorer", "iexplore", "WhatsApp Web")); dummyList.Add(new ArtifactTest("(2) WhatsApp Web ?- Microsoft Edge", "microsoftedge", "WhatsApp Web")); dummyList.Add(new ArtifactTest("(3) WhatsApp Web - Microsoft Edge", "microsoftedge", "WhatsApp Web")); dummyList.Add(new ArtifactTest("(4) WhatsApp Web - Google Chrome", "chrome", "WhatsApp Web")); dummyList.Add(new ArtifactTest("Testing.pptx [Geschuetzte Ansicht] - Mozilla Firefox", "firefox", "Testing.pptx")); dummyList.Add(new ArtifactTest("Testing.pptx [Geschuetzte Ansicht] (4) - Mozilla Firefox", "firefox", "Testing.pptx")); dummyList.Add(new ArtifactTest("Testing.pptx (4) (4) [Geschuetzte Ansicht] - Mozilla Firefox", "firefox", "Testing.pptx")); //dummyList.Add(new ArtifactTest("chrome", "Save as", "")); // run method foreach (var row in dummyList) { var website = WindowTitleWebsitesExtractor.GetWebsiteDetails(row.InputProcess, row.InputTitle); Debug.WriteLine(row.OutputExpected + " - vs - " + website); Assert.AreEqual(row.OutputExpected, website); } }
/// <summary> /// Fetches the activities a developer has on his computer for a given date in an /// ordered list according to time. Each activity matched to a single window ** temporary ** /// </summary> /// <param name="date"></param> /// <returns></returns> internal static List <WindowsActivity> GetDayWindowTitleData(DateTimeOffset date) { var orderedActivityList = new List <WindowsActivity>(); try { var query = "SELECT tsStart, tsEnd, window, process, (strftime('%s', tsEnd) - strftime('%s', tsStart)) as 'durInSec' " + "FROM " + Settings.DbTable + " " + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(VisType.Day, date, "tsStart") + " AND " + Database.GetInstance().GetDateFilteringStringForQuery(VisType.Day, date, "tsEnd") + " " + "ORDER BY tsStart;"; var table = Database.GetInstance().ExecuteReadQuery(query); if (table != null) { WindowsActivity previousWindowsActivityEntry = null; foreach (DataRow row in table.Rows) { // fetch items from database var e = new WindowsActivity(); e.StartTime = DateTime.Parse((string)row["tsStart"], CultureInfo.InvariantCulture); e.EndTime = DateTime.Parse((string)row["tsEnd"], CultureInfo.InvariantCulture); e.DurationInSeconds = row.IsNull("durInSec") ? 0 : Convert.ToInt32(row["durInSec"], CultureInfo.InvariantCulture); var processName = (string)row["process"]; // make window titles more readable (TODO: improve!) var windowTitle = (string)row["window"]; windowTitle = WindowTitleWebsitesExtractor.GetWebsiteDetails(processName, windowTitle); //windowTitle = WindowTitleArtifactExtractor.GetArtifactDetails(processName, windowTitle); //windowTitle = WindowTitleCodeExtractor.GetProjectName(windowTitle); // map process and window to activity e.ActivityCategory = ProcessToActivityMapper.Map(processName, windowTitle); // check if we add a as first item or not if (previousWindowsActivityEntry != null) { e.WindowProcessList.Add(new WindowProcessItem(processName, windowTitle)); orderedActivityList.Add(e); } else // first item { orderedActivityList.Add(e); } previousWindowsActivityEntry = e; } table.Dispose(); } } catch (Exception e) { Logger.WriteToLogFile(e); } return(orderedActivityList); }
/// <summary> /// Fetches the visited websites, cleanes it for the MinDuration. /// Hint: no need to sort, as they already comed sorted by duration. /// </summary> /// <param name="date"></param> /// <returns></returns> internal static List <TimeSpentItem> GetCleanedWebsites(DateTimeOffset date) { var maxWebsites = 25; var websites = WindowTitleWebsitesExtractor.GetWebsitesVisited(date); var websitesFiltered = websites.Where(w => w.DurationInMins > MinDurationInMins).Take(maxWebsites).ToList(); var list = new List <TimeSpentItem>(); foreach (var w in websitesFiltered) { var item = new TimeSpentItem(TimeSpentType.Website, w.ItemName, w.DurationInMins); list.Add(item); } return(list); }
/// <summary> /// Fetches the activities a developer has on his computer for a given date in an /// ordered list according to time. /// </summary> /// <param name="date"></param> /// <returns></returns> internal static List <WindowsActivity> GetDayTimelineData(DateTimeOffset date) { var orderedActivityList = new List <WindowsActivity>(); try { var query = "SELECT t1.time as 'tsStart', t2.time as 'tsEnd', t1.window, t1.process, (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'durInSec' " //t1.id, t1.time as 'from', t2.time as 'to' + "FROM " + Settings.DbTable + " t1 LEFT JOIN " + Settings.DbTable + " t2 on t1.id + 1 = t2.id " + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(VisType.Day, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(VisType.Day, date, "t2.time") + " " + "ORDER BY t1.time;"; var table = Database.GetInstance().ExecuteReadQuery(query); WindowsActivity _previousWindowsActivityEntry = null; foreach (DataRow row in table.Rows) { // fetch items from database var e = new WindowsActivity(); e.StartTime = DateTime.Parse((string)row["tsStart"], CultureInfo.InvariantCulture); e.EndTime = DateTime.Parse((string)row["tsEnd"], CultureInfo.InvariantCulture); e.DurationInSeconds = row.IsNull("durInSec") ? 0 : Convert.ToInt32(row["durInSec"], CultureInfo.InvariantCulture); var processName = (string)row["process"]; // make window titles more readable (TODO: improve!) var windowTitle = (string)row["window"]; windowTitle = WindowTitleWebsitesExtractor.GetWebsiteDetails(processName, windowTitle); windowTitle = WindowTitleArtifactExtractor.GetArtifactDetails(processName, windowTitle); windowTitle = WindowTitleCodeExtractor.GetProjectName(windowTitle); // map process and window to activity ProcessToActivityMapper.Map(e, processName, windowTitle); // check if we add a new item, or merge with the previous one if (_previousWindowsActivityEntry != null) { // previous item is same, update it (duration and tsEnd) if (e.ActivityCategory == _previousWindowsActivityEntry.ActivityCategory) { var lastItem = orderedActivityList.Last(); lastItem.DurationInSeconds += e.DurationInSeconds; lastItem.EndTime = e.EndTime; lastItem.WindowProcessList.Add(new WindowProcessItem(processName, windowTitle)); } // previous item is different, add it to list else { e.WindowProcessList.Add(new WindowProcessItem(processName, windowTitle)); orderedActivityList.Add(e); } } else // first item { orderedActivityList.Add(e); } _previousWindowsActivityEntry = e; } table.Dispose(); } catch (Exception e) { Logger.WriteToLogFile(e); } return(orderedActivityList); }
/// <summary> /// Fetches window titles organized into specifed blocks of time /// </summary> /// <param name="date"></param> /// <param name="numSecs"></param> /// <returns></returns> internal static List <List <string> > GetWindowTitles(int numSecs, DateTimeOffset date) { int currBlock = 0; // current time block int currentTime = 0; List <List <string> > titles = new List <List <string> >(); try { var query = "SELECT tsStart, tsEnd, window, process, (strftime('%s', tsEnd) - strftime('%s', tsStart)) as 'durInSec' " + "FROM " + Settings.DbTable + " " + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(VisType.Day, date, "tsStart") + " AND " + Database.GetInstance().GetDateFilteringStringForQuery(VisType.Day, date, "tsEnd") + " " + "ORDER BY tsStart;"; var table = Database.GetInstance().ExecuteReadQuery(query); if (table != null) { foreach (DataRow row in table.Rows) { // fetch items from database int duration = row.IsNull("durInSec") ? 0 : Convert.ToInt32(row["durInSec"], CultureInfo.InvariantCulture); // in seconds var processName = (string)row["process"]; var startTime = DateTime.Parse((string)row["tsStart"], CultureInfo.InvariantCulture); var endTime = DateTime.Parse((string)row["tsEnd"], CultureInfo.InvariantCulture); // make window titles more readable (TODO: improve!) var windowTitle = (string)row["window"]; windowTitle = WindowTitleWebsitesExtractor.GetWebsiteDetails(processName, windowTitle); int startBlock = currentTime / numSecs; // block of time in which the window title began currentTime += duration; int endBlock = currentTime / numSecs; // block of time in which the window title ended // add the window title to all blocks of time it occured in for (int i = startBlock; i <= endBlock; i++) { if (i >= titles.Count) // if there is no block for this time window in the list { List <string> newBlock = new List <string>(); newBlock.Add(windowTitle + " - (" + processName + ")"); titles.Add(newBlock); } else { titles[i].Add(windowTitle + " - (" + processName + ")"); } currBlock++; } } table.Dispose(); } } catch (Exception e) { Logger.WriteToLogFile(e); } return(titles); }