BlockingStateCallback.java revision 5a772174d14175474e76701b07cc0be86c3df32a
1a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala/* 2a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Copyright 2013 The Android Open Source Project 3a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 4a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * you may not use this file except in compliance with the License. 6a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * You may obtain a copy of the License at 7a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 8a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 10a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * See the License for the specific language governing permissions and 14a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * limitations under the License. 15a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 16a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalapackage com.android.ex.camera2.blocking; 17a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 18a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport android.hardware.camera2.CameraDevice; 19a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport android.os.Handler; 20a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport android.os.SystemClock; 21a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport android.util.Log; 22a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 23a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport com.android.ex.camera2.exceptions.TimeoutRuntimeException; 24a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 25a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport java.util.Arrays; 26a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport java.util.Collection; 27a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport java.util.concurrent.LinkedBlockingQueue; 28a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvalaimport java.util.concurrent.TimeUnit; 29a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 30a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 31a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala/** 32a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * A camera device listener that implements blocking operations on state changes. 33a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 34a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * <p>Provides wait calls that block until the next unobserved state of the 35a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * requested type arrives. Unobserved states are states that have occurred since 36a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * the last wait, or that will be received from the camera device in the 37a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * future.</p> 38a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 39bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala * <p>Pass-through all StateCallback changes to the proxy.</p> 40a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 41a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 42bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvalapublic class BlockingStateCallback extends CameraDevice.StateCallback { 43bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala private static final String TAG = "BlockingStateCallback"; 44a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE); 45a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 46bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala private final CameraDevice.StateCallback mProxy; 47a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 48a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala // Guards mWaiting 49a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala private final Object mLock = new Object(); 50a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala private boolean mWaiting = false; 51a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 52a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala private final LinkedBlockingQueue<Integer> mRecentStates = 53a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala new LinkedBlockingQueue<Integer>(); 54a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 55a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala private void setCurrentState(int state) { 56a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala if (VERBOSE) Log.v(TAG, "Camera device state now " + stateToString(state)); 57a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala try { 58a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala mRecentStates.put(state); 595a772174d14175474e76701b07cc0be86c3df32aJiawen Chen } catch (InterruptedException e) { 60a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala throw new RuntimeException("Unable to set device state", e); 61a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 62a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 63a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 64a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala private static final String[] mStateNames = { 65a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala "STATE_UNINITIALIZED", 66a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala "STATE_OPENED", 67a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala "STATE_CLOSED", 68a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala "STATE_DISCONNECTED", 69a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala "STATE_ERROR" 70a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala }; 71a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 72a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 73a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Device has not reported any state yet 74a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 75a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public static final int STATE_UNINITIALIZED = -1; 76a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 77a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 78a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Device is in the first-opened state (transitory) 79a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 80a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public static final int STATE_OPENED = 0; 81a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 82a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 83a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Device is closed 84a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 8591a9eebe63a2481ed6adbc59ecfbb22ce41fc65eEino-Ville Talvala public static final int STATE_CLOSED = 1; 86a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 87a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 88a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Device is disconnected 89a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 9091a9eebe63a2481ed6adbc59ecfbb22ce41fc65eEino-Ville Talvala public static final int STATE_DISCONNECTED = 2; 91a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 92a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 93a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Device has encountered a fatal error 94a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 9591a9eebe63a2481ed6adbc59ecfbb22ce41fc65eEino-Ville Talvala public static final int STATE_ERROR = 3; 96a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 97a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 98a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Total number of reachable states 99a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 1005a772174d14175474e76701b07cc0be86c3df32aJiawen Chen private static final int NUM_STATES = 4; 101a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 102bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala public BlockingStateCallback() { 103a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala mProxy = null; 104a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 105a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 106bb013aa3e197e881756be5ad13e6ad30bfb4aeffEino-Ville Talvala public BlockingStateCallback(CameraDevice.StateCallback listener) { 107a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala mProxy = listener; 108a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 109a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 110a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala @Override 111a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public void onOpened(CameraDevice camera) { 1125a772174d14175474e76701b07cc0be86c3df32aJiawen Chen if (mProxy != null) { 1135a772174d14175474e76701b07cc0be86c3df32aJiawen Chen mProxy.onOpened(camera); 1145a772174d14175474e76701b07cc0be86c3df32aJiawen Chen } 115f24f9918f9dc081ccad9871dc174bf3b3e47059aIgor Murashkin setCurrentState(STATE_OPENED); 116a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 117a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 118a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala @Override 119a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public void onDisconnected(CameraDevice camera) { 1205a772174d14175474e76701b07cc0be86c3df32aJiawen Chen if (mProxy != null) { 1215a772174d14175474e76701b07cc0be86c3df32aJiawen Chen mProxy.onDisconnected(camera); 1225a772174d14175474e76701b07cc0be86c3df32aJiawen Chen } 123f24f9918f9dc081ccad9871dc174bf3b3e47059aIgor Murashkin setCurrentState(STATE_DISCONNECTED); 124a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 125a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 126a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala @Override 127a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public void onError(CameraDevice camera, int error) { 1285a772174d14175474e76701b07cc0be86c3df32aJiawen Chen if (mProxy != null) { 1295a772174d14175474e76701b07cc0be86c3df32aJiawen Chen mProxy.onError(camera, error); 1305a772174d14175474e76701b07cc0be86c3df32aJiawen Chen } 131f24f9918f9dc081ccad9871dc174bf3b3e47059aIgor Murashkin setCurrentState(STATE_ERROR); 132a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 133a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 134a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala @Override 135a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public void onClosed(CameraDevice camera) { 1365a772174d14175474e76701b07cc0be86c3df32aJiawen Chen if (mProxy != null) { 1375a772174d14175474e76701b07cc0be86c3df32aJiawen Chen mProxy.onClosed(camera); 1385a772174d14175474e76701b07cc0be86c3df32aJiawen Chen } 139f24f9918f9dc081ccad9871dc174bf3b3e47059aIgor Murashkin setCurrentState(STATE_CLOSED); 140a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 141a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 142a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 143a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Wait until the desired state is observed, checking all state 144a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * transitions since the last state that was waited on. 145a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 146a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * <p>Note: Only one waiter allowed at a time!</p> 147a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 1485a772174d14175474e76701b07cc0be86c3df32aJiawen Chen * @param state state to observe a transition to 149a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * @param timeout how long to wait in milliseconds 150a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 151a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * @throws TimeoutRuntimeException if the desired state is not observed before timeout. 152a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 153a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public void waitForState(int state, long timeout) { 154a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala Integer[] stateArray = { state }; 155a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 156a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala waitForAnyOfStates(Arrays.asList(stateArray), timeout); 157a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 158a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 159a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 160a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Wait until the one of the desired states is observed, checking all 161a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * state transitions since the last state that was waited on. 162a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 163a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * <p>Note: Only one waiter allowed at a time!</p> 164a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 165a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * @param states Set of desired states to observe a transition to. 166a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * @param timeout how long to wait in milliseconds 167a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 168a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * @return the state reached 169a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * @throws TimeoutRuntimeException if none of the states is observed before timeout. 170a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * 171a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 172a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public int waitForAnyOfStates(Collection<Integer> states, final long timeout) { 1735a772174d14175474e76701b07cc0be86c3df32aJiawen Chen synchronized (mLock) { 1745a772174d14175474e76701b07cc0be86c3df32aJiawen Chen if (mWaiting) { 1755a772174d14175474e76701b07cc0be86c3df32aJiawen Chen throw new IllegalStateException("Only one waiter allowed at a time"); 1765a772174d14175474e76701b07cc0be86c3df32aJiawen Chen } 177a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala mWaiting = true; 178a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 179a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala if (VERBOSE) { 180a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala StringBuilder s = new StringBuilder("Waiting for state(s) "); 181a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala appendStates(s, states); 182a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala Log.v(TAG, s.toString()); 183a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 184a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 185a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala Integer nextState = null; 186a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala long timeoutLeft = timeout; 187a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala long startMs = SystemClock.elapsedRealtime(); 188a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala try { 189a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala while ((nextState = mRecentStates.poll(timeoutLeft, TimeUnit.MILLISECONDS)) 190a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala != null) { 191a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala if (VERBOSE) { 192a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala Log.v(TAG, " Saw transition to " + stateToString(nextState)); 193a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 194a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala if (states.contains(nextState)) break; 195a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala long endMs = SystemClock.elapsedRealtime(); 196a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala timeoutLeft -= (endMs - startMs); 197a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala startMs = endMs; 198a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 199a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } catch (InterruptedException e) { 200a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala throw new UnsupportedOperationException("Does not support interrupts on waits", e); 201a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 202a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 2035a772174d14175474e76701b07cc0be86c3df32aJiawen Chen synchronized (mLock) { 204a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala mWaiting = false; 205a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 206a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 207a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala if (!states.contains(nextState)) { 208a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala StringBuilder s = new StringBuilder("Timed out after "); 209a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala s.append(timeout); 210a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala s.append(" ms waiting for state(s) "); 211a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala appendStates(s, states); 212a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 213a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala throw new TimeoutRuntimeException(s.toString()); 214a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 215a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 216a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala return nextState; 217a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 218a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 219a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 220a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Convert state integer to a String 221a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 222a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public static String stateToString(int state) { 223a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala return mStateNames[state + 1]; 224a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 225a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala 226a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala /** 227a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala * Append all states to string 228a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala */ 229a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala public static void appendStates(StringBuilder s, Collection<Integer> states) { 230a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala boolean start = true; 2315a772174d14175474e76701b07cc0be86c3df32aJiawen Chen for (Integer state : states) { 232a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala if (!start) s.append(" "); 233a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala s.append(stateToString(state)); 234a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala start = false; 235a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 236a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala } 237a25c5599003b9e95cec566a94be6932bc42c00d3Eino-Ville Talvala} 238