1b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert/* 2b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * Copyright (C) 2010 The Android Open Source Project 3b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * 4b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 5b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * you may not use this file except in compliance with the License. 6b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * You may obtain a copy of the License at 7b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * 8b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 9b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * 10b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 11b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 12b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * See the License for the specific language governing permissions and 14b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * limitations under the License. 15b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert */ 16b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 17b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringertpackage com.android.quicksearchbox.util; 18b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 19b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringertimport android.os.Handler; 20b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 21b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert/** 22b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert * Consumer utilities. 23b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert */ 24b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringertpublic class Consumers { 25b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 26b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert private Consumers() {} 27b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 28b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public static <A extends QuietlyCloseable> void consumeCloseable(Consumer<A> consumer, 29b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert A value) { 30b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert boolean accepted = false; 31b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert try { 32b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert accepted = consumer.consume(value); 33b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } finally { 34b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert if (!accepted && value != null) value.close(); 35b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 36b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 37b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 38b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public static <A> void consumeAsync(Handler handler, 39b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert final Consumer<A> consumer, final A value) { 40b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert if (handler == null) { 41b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert consumer.consume(value); 42b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } else { 43b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert handler.post(new Runnable() { 44b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public void run() { 45b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert consumer.consume(value); 46b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 47b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert }); 48b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 49b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 50b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 51b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public static <A extends QuietlyCloseable> void consumeCloseableAsync(Handler handler, 52b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert final Consumer<A> consumer, final A value) { 53b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert if (handler == null) { 54b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert consumeCloseable(consumer, value); 55b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } else { 56b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert handler.post(new Runnable() { 57b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public void run() { 58b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert consumeCloseable(consumer, value); 59b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 60b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert }); 61b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 62b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 63b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 646859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert public static <A> Consumer<A> createAsyncConsumer( 656859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert final Handler handler, final Consumer<A> consumer) { 666859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert return new Consumer<A>() { 676859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert public boolean consume(A value) { 686859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert consumeAsync(handler, consumer, value); 696859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert return true; 706859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert } 716859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert }; 726859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert } 736859aead3af0680b2c9dc326244aa89835c2c852Bjorn Bringert 74b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public static <A extends QuietlyCloseable> Consumer<A> createAsyncCloseableConsumer( 75b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert final Handler handler, final Consumer<A> consumer) { 76b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert return new Consumer<A>() { 77b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert public boolean consume(A value) { 78b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert consumeCloseableAsync(handler, consumer, value); 79b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert return true; 80b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 81b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert }; 82b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert } 83b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert 84b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert} 85