16a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen/* 26a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Copyright (C) 2015 The Android Open Source Project 36a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 46a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Licensed under the Apache License, Version 2.0 (the "License"); 56a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * you may not use this file except in compliance with the License. 66a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * You may obtain a copy of the License at 76a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 86a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * http://www.apache.org/licenses/LICENSE-2.0 96a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * 106a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * Unless required by applicable law or agreed to in writing, software 116a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * distributed under the License is distributed on an "AS IS" BASIS, 126a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * See the License for the specific language governing permissions and 146a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * limitations under the License. 156a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 166a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 176a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenpackage com.android.statementservice; 186a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 196a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenimport android.util.Log; 206a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 216a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenimport java.util.concurrent.Callable; 226a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenimport java.util.concurrent.ExecutionException; 236a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenimport java.util.concurrent.FutureTask; 246a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 256a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen/** 266a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen * {@link FutureTask} that logs unhandled exceptions. 276a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen */ 286a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wenfinal class ExceptionLoggingFutureTask<V> extends FutureTask<V> { 296a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 306a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen private final String mTag; 316a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 326a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen public ExceptionLoggingFutureTask(Callable<V> callable, String tag) { 336a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen super(callable); 346a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen mTag = tag; 356a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 366a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen 376a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen @Override 386a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen protected void done() { 396a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen try { 406a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen get(); 416a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } catch (ExecutionException | InterruptedException e) { 426a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen Log.e(mTag, "Uncaught exception.", e); 436a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen throw new RuntimeException(e); 446a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 456a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen } 466a34bb2d6a6cbc7a70bdf0c53d238dc28e0b1d58Joseph Wen} 47