blob: 6acc298c58946137b968266756841d6e9d9b6e3c [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.test.transit;
import androidx.annotation.Nullable;
import org.chromium.base.Log;
import java.util.ArrayList;
import java.util.List;
/** A {@link Transition} out of a {@link StationFacility}. */
class FacilityCheckOut extends Transition {
private static final String TAG = "Transit";
private StationFacility mFacility;
/**
* Constructor. FacilityCheckOut is instantiated to leave a {@link StationFacility}.
*
* @param facility the {@link StationFacility} to leave.
* @param trigger the action that triggers the transition out of the facility. e.g. clicking a
* View.
*/
FacilityCheckOut(StationFacility facility, @Nullable Trigger trigger) {
super(trigger);
mFacility = facility;
}
void exitSync() {
onBeforeTransition();
triggerTransition();
List<ConditionWaiter.ConditionWaitStatus> waitStatuses = createWaitStatuses();
waitUntilExit(waitStatuses);
onAfterTransition();
PublicTransitConfig.maybePauseAfterTransition(mFacility);
}
private void onBeforeTransition() {
mFacility.setStateTransitioningFrom();
Log.i(TAG, "Will exit %s", mFacility);
}
@Override
protected void triggerTransition() {
super.triggerTransition();
Log.i(TAG, "Triggered exit from %s", mFacility);
}
private List<ConditionWaiter.ConditionWaitStatus> createWaitStatuses() {
ArrayList<ConditionWaiter.ConditionWaitStatus> waitStatuses = new ArrayList<>();
for (Condition condition : mFacility.getExitConditions()) {
waitStatuses.add(
new ConditionWaiter.ConditionWaitStatus(
condition, ConditionWaiter.ConditionOrigin.EXIT));
}
for (Condition condition : getTransitionConditions()) {
waitStatuses.add(
new ConditionWaiter.ConditionWaitStatus(
condition, ConditionWaiter.ConditionOrigin.TRANSITION));
}
return waitStatuses;
}
private void waitUntilExit(List<ConditionWaiter.ConditionWaitStatus> transitionConditions) {
try {
ConditionWaiter.waitFor(transitionConditions);
} catch (AssertionError e) {
throw TravelException.newExitFacilityException(mFacility, e);
}
}
private void onAfterTransition() {
mFacility.setStateFinished();
Log.i(TAG, "Exited %s", mFacility);
}
}