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