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