1386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall/* 2386c5b885b99f67f9c0a7380f4be153f28333089Puneet 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.settings; 18386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 19386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport com.android.camera.async.Observable; 20386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport com.android.camera.async.SafeCloseable; 21386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 22386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport java.util.concurrent.Executor; 23386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 24e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lallimport javax.annotation.CheckReturnValue; 25e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lallimport javax.annotation.Nonnull; 26386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallimport javax.annotation.concurrent.ThreadSafe; 27386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 28386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall/** 29386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * Wraps a {@link SettingsManager} setting with thread-safe interfaces for 30386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall * observing changes. 31386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall */ 32386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall@ThreadSafe 33386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lallpublic final class SettingObserver<T> implements Observable<T> { 34386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall private class Listener implements SettingsManager.OnSettingChangedListener, SafeCloseable { 35e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall private final Runnable mRunnable; 36e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall private final Executor mExecutor; 37386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 38e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall private Listener(Runnable runnable, Executor executor) { 39e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall mRunnable = runnable; 40e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall mExecutor = executor; 41386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 42386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 43386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall @Override 44386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall public void onSettingChanged(SettingsManager settingsManager, String key) { 45e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall mExecutor.execute(mRunnable); 46386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 47386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 48386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall @Override 49386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall public void close() { 50386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall mSettingsManager.removeListener(this); 51386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 52386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 53386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 54386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall private final SettingsManager mSettingsManager; 55386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall private final String mScope; 56386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall private final String mKey; 57386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall private final Class<T> mTClass; 58386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 59386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall private SettingObserver(SettingsManager manager, String scope, String key, Class<T> tClass) { 60386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall mSettingsManager = manager; 61386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall mScope = scope; 62386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall mKey = key; 63386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall mTClass = tClass; 64386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 65386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 66386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall public static SettingObserver<Integer> ofInteger(SettingsManager manager, 67386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall String scope, String key) { 68386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return new SettingObserver<>(manager, scope, key, 69386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall Integer.class); 70386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 71386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 72386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall public static SettingObserver<String> ofString(SettingsManager manager, 73386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall String scope, String key) { 74386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return new SettingObserver<>(manager, scope, key, 75386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall String.class); 76386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 77386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 78386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall public static SettingObserver<Boolean> ofBoolean(SettingsManager manager, 79386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall String scope, String key) { 80386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return new SettingObserver<>(manager, scope, key, 81386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall Boolean.class); 82386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 83386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 84e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall @CheckReturnValue 85e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall @Nonnull 86386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall @Override 87e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall public SafeCloseable addCallback(@Nonnull Runnable callback, @Nonnull Executor executor) { 88e606c4d68b74293e7d7725aecbaa9c915751cd43Puneet Lall Listener listener = new Listener(callback, executor); 89386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall mSettingsManager.addListener(listener); 90386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return listener; 91386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 92386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall 93e919a48fb40b9d6c698a495acf40adbc0e320431Puneet Lall @Nonnull 94386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall @Override 95386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall @SuppressWarnings("unchecked") 96386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall public T get() { 97386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall if (mTClass.equals(Integer.class)) { 98386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return (T) Integer.valueOf(mSettingsManager.getInteger(mScope, mKey)); 99386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } else if (mTClass.equals(String.class)) { 100386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall Object string = mSettingsManager.getString(mScope, mKey); 101386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall if (string == null) { 102386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return null; 103386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } else { 104386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return (T) string; 105386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 106386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } else if (mTClass.equals(Boolean.class)) { 107386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall return (T) Boolean.valueOf(mSettingsManager.getBoolean(mScope, mKey)); 108386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } else { 109386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall // Impossible branch 110386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall throw new IllegalStateException("T must be one of {Integer, Boolean, String}"); 111386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 112386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall } 113386c5b885b99f67f9c0a7380f4be153f28333089Puneet Lall} 114