19 package org.sleuthkit.autopsy.communications;
21 import com.google.common.collect.ImmutableSet;
22 import java.awt.event.ItemListener;
23 import java.beans.PropertyChangeListener;
24 import java.time.LocalDate;
25 import java.time.ZoneId;
26 import java.util.EnumSet;
27 import java.util.HashMap;
29 import java.util.Map.Entry;
30 import java.util.logging.Level;
31 import java.util.stream.Collectors;
32 import javax.swing.JCheckBox;
33 import javax.swing.JPanel;
34 import org.openide.util.NbBundle;
47 import org.
sleuthkit.datamodel.CommunicationsFilter.AccountTypeFilter;
48 import org.
sleuthkit.datamodel.CommunicationsFilter.DateRangeFilter;
49 import org.
sleuthkit.datamodel.CommunicationsFilter.DeviceFilter;
51 import static org.
sleuthkit.datamodel.Relationship.Type.CALL_LOG;
52 import static org.
sleuthkit.datamodel.Relationship.Type.MESSAGE;
75 private final Map<String, JCheckBox>
devicesMap = new HashMap<>();
103 @NbBundle.Messages({
"refreshText=Refresh Results",
"applyText=Apply"})
132 String eventType = pce.getPropertyName();
133 if (eventType.equals(DATA_ADDED.toString())) {
136 if (null != eventData
157 boolean someDevice =
devicesMap.values().stream().anyMatch(JCheckBox::isSelected);
158 boolean someAccountType =
accountTypeMap.values().stream().anyMatch(JCheckBox::isSelected);
171 void updateAndApplyFilters(
boolean initialState) {
177 dateRangeLabel.setText(
"Date Range ( " + Utils.getUserPreferredZoneId().toString() +
"):");
201 super.removeNotify();
215 Account.Type.PREDEFINED_ACCOUNT_TYPES.forEach(type -> {
216 if (type.equals(Account.Type.CREDIT_CARD)) {
220 final JCheckBox jCheckBox =
new JCheckBox(
221 "<html><table cellpadding=0><tr><td><img src=\""
222 +
FiltersPanel.class.getResource(Utils.getIconFilePath(type))
223 +
"\"/></td><td width=" + 3 +
"><td>" + type.getDisplayName() +
"</td></tr></table></html>",
228 if (t.equals(Account.Type.DEVICE)) {
245 for (DataSource dataSource : sleuthkitCase.getDataSources()) {
246 String dsName = sleuthkitCase.getContentById(dataSource.getId()).getName();
248 devicesMap.computeIfAbsent(dataSource.getDeviceId(), ds -> {
249 final JCheckBox jCheckBox =
new JCheckBox(dsName, initialState);
256 logger.log(Level.WARNING,
"Communications Visualization Tool opened with no open case.", ex);
257 }
catch (TskCoreException tskCoreException) {
258 logger.log(Level.SEVERE,
"There was a error loading the datasources for the case.", tskCoreException);
267 @SuppressWarnings(
"unchecked")
271 applyFiltersButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/communications/images/tick.png")));
275 filtersTitleLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/communications/images/funnel.png")));
280 public void actionPerformed(java.awt.event.ActionEvent evt) {
285 accountTypesLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/accounts.png")));
290 public void actionPerformed(java.awt.event.ActionEvent evt) {
298 accountTypeRequiredLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/error-icon-16.png")));
303 javax.swing.GroupLayout jPanel2Layout =
new javax.swing.GroupLayout(
jPanel2);
304 jPanel2.setLayout(jPanel2Layout);
305 jPanel2Layout.setHorizontalGroup(
306 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
307 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
308 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
309 .addGroup(jPanel2Layout.createSequentialGroup()
311 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
313 .addGroup(jPanel2Layout.createSequentialGroup()
315 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
317 .addGroup(jPanel2Layout.createSequentialGroup()
318 .addGap(0, 0, Short.MAX_VALUE)
320 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
324 jPanel2Layout.setVerticalGroup(
325 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
326 .addGroup(jPanel2Layout.createSequentialGroup()
327 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
330 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
331 .addComponent(
jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE)
332 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
333 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
340 public void actionPerformed(java.awt.event.ActionEvent evt) {
345 devicesLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/image.png")));
350 public void actionPerformed(java.awt.event.ActionEvent evt) {
355 jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
356 jScrollPane2.setMinimumSize(
new java.awt.Dimension(27, 75));
358 devicesPane.setMinimumSize(
new java.awt.Dimension(4, 100));
362 deviceRequiredLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/error-icon-16.png")));
367 javax.swing.GroupLayout jPanel3Layout =
new javax.swing.GroupLayout(
jPanel3);
368 jPanel3.setLayout(jPanel3Layout);
369 jPanel3Layout.setHorizontalGroup(
370 jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
371 .addGroup(jPanel3Layout.createSequentialGroup()
373 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
375 .addGroup(jPanel3Layout.createSequentialGroup()
377 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
378 .addGroup(jPanel3Layout.createSequentialGroup()
379 .addGap(0, 0, Short.MAX_VALUE)
381 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
383 .addComponent(
jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
385 jPanel3Layout.setVerticalGroup(
386 jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
387 .addGroup(jPanel3Layout.createSequentialGroup()
388 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
391 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
392 .addComponent(
jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 94, Short.MAX_VALUE)
393 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
394 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
402 dateRangeLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/calendar.png")));
406 startCheckBox.addChangeListener(
new javax.swing.event.ChangeListener() {
407 public void stateChanged(javax.swing.event.ChangeEvent evt) {
413 endCheckBox.addChangeListener(
new javax.swing.event.ChangeListener() {
414 public void stateChanged(javax.swing.event.ChangeEvent evt) {
421 javax.swing.GroupLayout jPanel4Layout =
new javax.swing.GroupLayout(
jPanel4);
422 jPanel4.setLayout(jPanel4Layout);
423 jPanel4Layout.setHorizontalGroup(
424 jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
425 .addGroup(jPanel4Layout.createSequentialGroup()
427 .addGap(0, 0, Short.MAX_VALUE))
428 .addGroup(jPanel4Layout.createSequentialGroup()
430 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
431 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
434 .addComponent(
endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
435 .addGroup(jPanel4Layout.createSequentialGroup()
438 .addComponent(
startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
441 jPanel4Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {endCheckBox, startCheckBox});
443 jPanel4Layout.setVerticalGroup(
444 jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
445 .addGroup(jPanel4Layout.createSequentialGroup()
448 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
449 .addComponent(
startDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
451 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
452 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
453 .addComponent(
endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
457 refreshButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png")));
463 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
464 this.setLayout(layout);
465 layout.setHorizontalGroup(
466 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
467 .addComponent(
jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
468 .addComponent(
jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
469 .addGroup(layout.createSequentialGroup()
471 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
472 .addComponent(
applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
473 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
475 .addComponent(
jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
476 .addGroup(layout.createSequentialGroup()
478 .addComponent(
needsRefreshLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
480 layout.setVerticalGroup(
481 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
482 .addGroup(layout.createSequentialGroup()
484 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
486 .addComponent(
applyFiltersButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
488 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
491 .addComponent(
jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
493 .addComponent(
jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
495 .addComponent(
jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
496 .addContainerGap(19, Short.MAX_VALUE))
504 CVTEvents.getCVTEventBus().post(
new CVTEvents.FilterChangeEvent(
getFilter()));
510 CommunicationsFilter commsFilter =
new CommunicationsFilter();
514 commsFilter.addAndFilter(
new CommunicationsFilter.RelationshipTypeFilter(
515 ImmutableSet.of(CALL_LOG, MESSAGE)));
525 DeviceFilter deviceFilter =
new DeviceFilter(
527 .filter(entry -> entry.getValue().isSelected())
529 .collect(Collectors.toSet()));
539 AccountTypeFilter accountTypeFilter =
new AccountTypeFilter(
541 .filter(entry -> entry.getValue().isSelected())
542 .map(entry -> entry.getKey())
543 .collect(Collectors.toSet()));
544 return accountTypeFilter;
553 ZoneId zone = Utils.getUserPreferredZoneId();
556 return new DateRangeFilter(start, end);
566 void setDeviceAccountTypeEnabled(
boolean enable) {
568 JCheckBox deviceCheckbox =
accountTypeMap.get(Account.Type.DEVICE);
569 if (deviceCheckbox != null) {
579 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
603 map.values().forEach(box -> box.setSelected(selected));
640 private final javax.swing.JLabel
devicesLabel =
new javax.swing.JLabel();
641 private final javax.swing.JPanel
devicesPane =
new javax.swing.JPanel();
642 private final javax.swing.JCheckBox
endCheckBox =
new javax.swing.JCheckBox();
643 private final com.github.lgooddatepicker.components.DatePicker
endDatePicker =
new com.github.lgooddatepicker.components.DatePicker();
645 private final javax.swing.JPanel
jPanel2 =
new javax.swing.JPanel();
646 private final javax.swing.JPanel
jPanel3 =
new javax.swing.JPanel();
647 private final javax.swing.JPanel
jPanel4 =
new javax.swing.JPanel();
648 private final javax.swing.JScrollPane
jScrollPane2 =
new javax.swing.JScrollPane();
649 private final javax.swing.JScrollPane
jScrollPane3 =
new javax.swing.JScrollPane();
651 private final javax.swing.JButton
refreshButton =
new javax.swing.JButton();
652 private final javax.swing.JCheckBox
startCheckBox =
new javax.swing.JCheckBox();
653 private final com.github.lgooddatepicker.components.DatePicker
startDatePicker =
new com.github.lgooddatepicker.components.DatePicker();
static final Logger logger
BlackboardArtifact.Type getBlackboardArtifactType()
void unCheckAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)
final javax.swing.JCheckBox endCheckBox
void removeIngestModuleEventListener(final PropertyChangeListener listener)
final javax.swing.JPanel jPanel2
final com.github.lgooddatepicker.components.DatePicker endDatePicker
static synchronized IngestManager getInstance()
final javax.swing.JButton applyFiltersButton
void unCheckAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt)
final javax.swing.JLabel filtersTitleLabel
boolean deviceAccountTypeEnabled
static Case getOpenCase()
void setAllDevicesSelected(boolean selected)
final javax.swing.JLabel needsRefreshLabel
final javax.swing.JLabel deviceRequiredLabel
final javax.swing.JCheckBox startCheckBox
final javax.swing.JLabel accountTypeRequiredLabel
final com.github.lgooddatepicker.components.DatePicker startDatePicker
void endCheckBoxStateChanged(javax.swing.event.ChangeEvent evt)
final javax.swing.JPanel devicesPane
void updateFilters(boolean initialState)
final javax.swing.JButton refreshButton
void startCheckBoxStateChanged(javax.swing.event.ChangeEvent evt)
void setAllAccountTypesSelected(boolean selected)
final javax.swing.JButton unCheckAllDevicesButton
static final String DISPLAY_TIMES_IN_LOCAL_TIME
final PropertyChangeListener ingestListener
final javax.swing.JLabel devicesLabel
void setAllSelected(Map<?, JCheckBox > map, boolean selected)
final javax.swing.JLabel dateRangeLabel
final javax.swing.JButton checkAllDevicesButton
CommunicationsFilter getFilter()
final javax.swing.JLabel accountTypesLabel
final javax.swing.JScrollPane jScrollPane3
SleuthkitCase getSleuthkitCase()
void checkAllAccountTypesButtonActionPerformed(java.awt.event.ActionEvent evt)
void updateDeviceFilter(boolean initialState)
final javax.swing.JButton checkAllAccountTypesButton
final Map< Account.Type, JCheckBox > accountTypeMap
static final long serialVersionUID
final javax.swing.JPanel jPanel4
final javax.swing.JPanel jPanel3
void addIngestModuleEventListener(final PropertyChangeListener listener)
final Map< String, JCheckBox > devicesMap
synchronized static Logger getLogger(String name)
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static void addChangeListener(PreferenceChangeListener listener)
void checkAllDevicesButtonActionPerformed(java.awt.event.ActionEvent evt)
final javax.swing.JScrollPane jScrollPane2
DeviceFilter getDeviceFilter()
DateRangeFilter getDateRangeFilter()
AccountTypeFilter getAccountTypeFilter()
void updateAccountTypeFilter()
final javax.swing.JButton unCheckAllAccountTypesButton
final ItemListener validationListener
final javax.swing.JPanel accountTypePane