1386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall/*
2875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall * Copyright (C) 2015 The Android Open Source Project
3386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall *
4386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * Licensed under the Apache License, Version 2.0 (the "License");
5386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * you may not use this file except in compliance with the License.
6386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * You may obtain a copy of the License at
7386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall *
8386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall *      http://www.apache.org/licenses/LICENSE-2.0
9386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall *
10386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * Unless required by applicable law or agreed to in writing, software
11386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * distributed under the License is distributed on an "AS IS" BASIS,
12386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * See the License for the specific language governing permissions and
14386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * limitations under the License.
15386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall */
16386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
17386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallpackage com.android.camera.async;
18386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
19386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport com.android.camera.util.Callback;
20386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport com.google.common.base.Function;
2181308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lallimport com.google.common.base.Supplier;
22875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lallimport com.google.common.util.concurrent.MoreExecutors;
23386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
24e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lallimport java.util.List;
25386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport java.util.concurrent.Executor;
26386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
27875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lallimport javax.annotation.CheckReturnValue;
28875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lallimport javax.annotation.Nonnull;
29e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lallimport javax.annotation.ParametersAreNonnullByDefault;
30875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall
31386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall/**
32386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * Helper methods for {@link Observable}.
33386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall */
34e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall@ParametersAreNonnullByDefault
35386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallpublic class Observables {
36e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall    private static final SafeCloseable NOOP_CALLBACK_HANDLE = new SafeCloseable() {
37e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall        @Override
38e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall        public void close() {
39e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            // Do Nothing.
40e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall        }
41e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall    };
42e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall
43386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    private Observables() {
44386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    }
45386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
46386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    /**
47386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall     * Transforms an observable with a function.
48386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall     *
49386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall     * @return The transformed observable.
50386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall     */
51386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    public static <F, T> Observable<T> transform(final Observable<F> input,
52386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            final Function<F, T> function) {
53386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall        return new Observable<T>() {
54e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            @Nonnull
55386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            @Override
56386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            public T get() {
57386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall                return function.apply(input.get());
58386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            }
59386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
60e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            @CheckReturnValue
61e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            @Nonnull
62386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            @Override
63e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall            public SafeCloseable addCallback(Runnable callback, Executor executor) {
64e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall                return input.addCallback(callback, executor);
65386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            }
66386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall        };
67386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    }
68386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
69386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    /**
7081308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall     * @return An observable which recomputes its output every time an input changes.
7181308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall     */
7281308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall    public static <T> Observable<T> transform(final List<? extends Observable<?>> inputs,
7381308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall                                              final Supplier<T> output) {
7481308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall        return ObservableCombiner.transform(inputs, output);
7581308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall    }
7681308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall
7781308a22b0f64c6667f6c23adee9da520415bcb6Puneet Lall    /**
78e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall     * Transforms a set of observables with a function.
79e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall     *
80e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall     * @return The transformed observable.
81e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall     */
82e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall    public static <F, T> Observable<T> transform(final List<? extends Observable<F>> input,
83e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            Function<List<F>, T> function) {
84e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall        return ObservableCombiner.transform(input, function);
85e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall    }
86e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall
87e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall    /**
88386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall     * @return An observable which has the given constant value.
89386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall     */
90875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall    @Nonnull
9163204dc989dbd0eba56f65086fde0ebe29ed6bdbPuneet Lall    public static <T> Observable<T> of(final @Nonnull T constant) {
92386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall        return new Observable<T>() {
93e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            @Nonnull
94386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            @Override
95386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            public T get() {
96386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall                return constant;
97386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            }
98386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall
99e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            @CheckReturnValue
100e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            @Nonnull
101386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            @Override
102e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall            public SafeCloseable addCallback(Runnable callback, Executor executor) {
103e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall                return NOOP_CALLBACK_HANDLE;
104386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall            }
105386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall        };
106386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall    }
107875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall
108875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall    @Nonnull
109875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall    @CheckReturnValue
110e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall    public static <T> SafeCloseable addThreadSafeCallback(final Observable<T> observable,
111e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall            final Updatable<T> callback) {
112e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall        return observable.addCallback(new Runnable() {
113875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall            @Override
114e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall            public void run() {
115e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall                callback.update(observable.get());
116875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall            }
117875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall        }, MoreExecutors.sameThreadExecutor());
118875d9fff24e283efa5d95ad75c3fab074e489fa4Puneet Lall    }
119386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall}
120