make sure unseen groups always get updated when a group is marked as seen

This commit is contained in:
millmanorama 2018-08-28 08:45:22 +02:00
parent 2d661e66c8
commit dba02a6ffa
2 changed files with 42 additions and 40 deletions

View File

@ -1,7 +1,7 @@
/* /*
* Autopsy Forensic Browser * Autopsy Forensic Browser
* *
* Copyright 2011-17 Basis Technology Corp. * Copyright 2011-18 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org * Contact: carrier <at> sleuthkit <dot> org
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -19,6 +19,7 @@
package org.sleuthkit.autopsy.imagegallery.actions; package org.sleuthkit.autopsy.imagegallery.actions;
import java.util.Optional; import java.util.Optional;
import javafx.application.Platform;
import javafx.beans.Observable; import javafx.beans.Observable;
import javafx.beans.value.ObservableValue; import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
@ -41,52 +42,57 @@ import org.sleuthkit.autopsy.imagegallery.datamodel.grouping.GroupViewState;
public class NextUnseenGroup extends Action { public class NextUnseenGroup extends Action {
private static final String IMAGE_PATH = "/org/sleuthkit/autopsy/imagegallery/images/"; //NON-NLS private static final String IMAGE_PATH = "/org/sleuthkit/autopsy/imagegallery/images/"; //NON-NLS
private static final Image END = new Image(NextUnseenGroup.class.getResourceAsStream( private static final Image END_IMAGE = new Image(NextUnseenGroup.class.getResourceAsStream(
IMAGE_PATH + "control-stop.png")); //NON-NLS IMAGE_PATH + "control-stop.png")); //NON-NLS
private static final Image ADVANCE = new Image(NextUnseenGroup.class.getResourceAsStream( private static final Image ADVANCE_IMAGE = new Image(NextUnseenGroup.class.getResourceAsStream(
IMAGE_PATH + "control-double.png")); //NON-NLS IMAGE_PATH + "control-double.png")); //NON-NLS
private static final String MARK_GROUP_SEEN = Bundle.NextUnseenGroup_markGroupSeen(); private static final String MARK_GROUP_SEEN = Bundle.NextUnseenGroup_markGroupSeen();
private static final String NEXT_UNSEEN_GROUP = Bundle.NextUnseenGroup_nextUnseenGroup(); private static final String NEXT_UNSEEN_GROUP = Bundle.NextUnseenGroup_nextUnseenGroup();
private final ImageGalleryController controller;
private final ObservableList<DrawableGroup> unSeenGroups;
public NextUnseenGroup(ImageGalleryController controller) { public NextUnseenGroup(ImageGalleryController controller) {
super(NEXT_UNSEEN_GROUP); super(NEXT_UNSEEN_GROUP);
setGraphic(new ImageView(ADVANCE_IMAGE));
this.controller = controller;
GroupManager groupManager = controller.getGroupManager(); GroupManager groupManager = controller.getGroupManager();
unSeenGroups = groupManager.getUnSeenGroups();
unSeenGroups.addListener((Observable observable) -> this.updateButton());
ObservableList<DrawableGroup> unSeenGroups = groupManager.getUnSeenGroups(); setEventHandler(event -> { //on fx-thread
setGraphic(new ImageView(ADVANCE));
unSeenGroups.addListener((Observable o) -> this.updateButton(unSeenGroups));
setEventHandler(event -> {
//fx-thread
//if there is a group assigned to the view, mark it as seen //if there is a group assigned to the view, mark it as seen
Optional.ofNullable(controller.viewState()) Optional.ofNullable(controller.viewState())
.map(ObservableValue<GroupViewState>::getValue) .map(ObservableValue<GroupViewState>::getValue)
.map(GroupViewState::getGroup) .map(GroupViewState::getGroup)
.ifPresent(group -> groupManager.saveGroupSeen(group, true)); .ifPresent(group -> {
groupManager.saveGroupSeen(group, true)
.addListener(this::advanceToNextUnseenGroup, Platform::runLater);
});
});
updateButton();
}
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
private void advanceToNextUnseenGroup() {
if (unSeenGroups.isEmpty() == false) { if (unSeenGroups.isEmpty() == false) {
controller.advance(GroupViewState.tile(unSeenGroups.get(0)), true); controller.advance(GroupViewState.tile(unSeenGroups.get(0)), true);
updateButton(unSeenGroups);
} }
}); updateButton();
updateButton(unSeenGroups);
} }
/**
*
* @param unSeenGroups the value of unSeenGroups
*/
@ThreadConfined(type = ThreadConfined.ThreadType.JFX) @ThreadConfined(type = ThreadConfined.ThreadType.JFX)
private void updateButton(ObservableList<DrawableGroup> unSeenGroups) { private void updateButton() {
setDisabled(unSeenGroups.isEmpty()); setDisabled(unSeenGroups.isEmpty());
if (unSeenGroups.size() <= 1) { if (unSeenGroups.size() <= 1) {
setText(MARK_GROUP_SEEN); setText(MARK_GROUP_SEEN);
setGraphic(new ImageView(END)); setGraphic(new ImageView(END_IMAGE));
} else { } else {
setText(NEXT_UNSEEN_GROUP); setText(NEXT_UNSEEN_GROUP);
setGraphic(new ImageView(ADVANCE)); setGraphic(new ImageView(ADVANCE_IMAGE));
} }
} }
} }

View File

@ -286,20 +286,19 @@ public class GroupManager {
* DB. * DB.
*/ */
public ListenableFuture<?> saveGroupSeen(DrawableGroup group, boolean seen) { public ListenableFuture<?> saveGroupSeen(DrawableGroup group, boolean seen) {
synchronized (controller) {
DrawableDB db = getDB(); DrawableDB db = getDB();
if (nonNull(db)) { if (nonNull(db)) {
return exec.submit(() -> { return exec.submit(() -> {
try { try {
db.markGroupSeen(group.getGroupKey(), seen); db.markGroupSeen(group.getGroupKey(), seen);
group.setSeen(seen); group.setSeen(seen);
Platform.runLater(() -> updateUnSeenGroups(group, seen));
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Error marking group as seen", ex); //NON-NLS logger.log(Level.SEVERE, "Error marking group as seen", ex); //NON-NLS
} }
}); });
} }
}
return Futures.immediateFuture(null); return Futures.immediateFuture(null);
} }
@ -659,9 +658,7 @@ public class GroupManager {
group = new DrawableGroup(groupKey, fileIDs, groupSeen); group = new DrawableGroup(groupKey, fileIDs, groupSeen);
controller.getCategoryManager().registerListener(group); controller.getCategoryManager().registerListener(group);
group.seenProperty().addListener((o, oldSeen, newSeen) group.seenProperty().addListener((o, oldSeen, newSeen)
-> saveGroupSeen(group, newSeen) -> saveGroupSeen(group, newSeen));
.addListener(() -> updateUnSeenGroups(group, newSeen),
Platform::runLater));
groupMap.put(groupKey, group); groupMap.put(groupKey, group);
} }
@ -857,7 +854,6 @@ public class GroupManager {
default: default:
//otherwise do straight db query //otherwise do straight db query
if (nonNull(db)) { if (nonNull(db)) {
//TODO -1017: pass datasource in here as appropriate
values = db.findValuesForAttribute(groupBy, sortBy, sortOrder, dataSource); values = db.findValuesForAttribute(groupBy, sortBy, sortOrder, dataSource);
} }
} }