1f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li/* 2f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * Copyright (C) 2010 The Android Open Source Project 3f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * 4f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License"); 5f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * you may not use this file except in compliance with the License. 6f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * You may obtain a copy of the License at 7f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * 8f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * http://www.apache.org/licenses/LICENSE-2.0 9f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * 10f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * Unless required by applicable law or agreed to in writing, software 11f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS, 12f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * See the License for the specific language governing permissions and 14f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li * limitations under the License. 15f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li */ 16f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 17f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Lipackage com.android.camera.ui; 18f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 19c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Liimport com.android.camera.CameraSettings; 20f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport com.android.camera.IconListPreference; 21039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport com.android.camera.R; 22f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 23f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport android.content.Context; 24d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Liimport android.util.Log; 25039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.LayoutInflater; 26039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.ViewGroup; 27f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 28039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// An indicator button that represents one camera setting. Ex: flash. Pressing it opens a popup 29039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// window. 304b9791ff6763d310c750892b774119ad750c512aChih-yu Huangpublic class IndicatorButton extends AbstractIndicatorButton 314b9791ff6763d310c750892b774119ad750c512aChih-yu Huang implements BasicSettingPopup.Listener, EffectSettingPopup.Listener{ 32d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li private final String TAG = "IndicatorButton"; 33f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li private IconListPreference mPreference; 34823d57389b616091827059ca6401f675e416a53bWu-cheng Li // Scene mode can override the original preference value. 35823d57389b616091827059ca6401f675e416a53bWu-cheng Li private String mOverrideValue; 36039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li private Listener mListener; 37039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 38039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li static public interface Listener { 39039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void onSettingChanged(); 40039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 41039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 42039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void setSettingChangedListener(Listener listener) { 43039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mListener = listener; 44039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 45f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 46f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li public IndicatorButton(Context context, IconListPreference pref) { 47f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li super(context); 48f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li mPreference = pref; 49f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li reloadPreference(); 50f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li } 51f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 524cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang @Override 53f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li public void reloadPreference() { 54e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li int[] iconIds = mPreference.getLargeIconIds(); 55e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li if (iconIds != null) { 56e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li // Each entry has a corresponding icon. 57823d57389b616091827059ca6401f675e416a53bWu-cheng Li int index; 58823d57389b616091827059ca6401f675e416a53bWu-cheng Li if (mOverrideValue == null) { 59823d57389b616091827059ca6401f675e416a53bWu-cheng Li index = mPreference.findIndexOfValue(mPreference.getValue()); 60823d57389b616091827059ca6401f675e416a53bWu-cheng Li } else { 61823d57389b616091827059ca6401f675e416a53bWu-cheng Li index = mPreference.findIndexOfValue(mOverrideValue); 62d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li if (index == -1) { 63d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li // Avoid the crash if camera driver has bugs. 64d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li Log.e(TAG, "Fail to find override value=" + mOverrideValue); 65d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li mPreference.print(); 66d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li return; 67d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li } 68823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 69d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan setImageResource(iconIds[index]); 70e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li } else { 71e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li // The preference only has a single icon to represent it. 72d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan setImageResource(mPreference.getSingleIcon()); 73e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li } 744cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang super.reloadPreference(); 75f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li } 76823d57389b616091827059ca6401f675e416a53bWu-cheng Li 77823d57389b616091827059ca6401f675e416a53bWu-cheng Li public String getKey() { 78823d57389b616091827059ca6401f675e416a53bWu-cheng Li return mPreference.getKey(); 79823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 80823d57389b616091827059ca6401f675e416a53bWu-cheng Li 81039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li @Override 82823d57389b616091827059ca6401f675e416a53bWu-cheng Li public boolean isOverridden() { 83823d57389b616091827059ca6401f675e416a53bWu-cheng Li return mOverrideValue != null; 84823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 85823d57389b616091827059ca6401f675e416a53bWu-cheng Li 86039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li @Override 87039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void overrideSettings(final String ... keyvalues) { 88039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mOverrideValue = null; 89039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li for (int i = 0; i < keyvalues.length; i += 2) { 90039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li String key = keyvalues[i]; 91039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li String value = keyvalues[i + 1]; 92039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li if (key.equals(getKey())) { 93039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mOverrideValue = value; 94039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li setEnabled(value == null); 95039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li break; 96039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 97039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 98823d57389b616091827059ca6401f675e416a53bWu-cheng Li reloadPreference(); 99823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 100039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 101039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li @Override 102039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li protected void initializePopup() { 103757459bc8ded7e5708d8ad99ff38a3cb41904640Chung-yih Wang LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( 104039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li Context.LAYOUT_INFLATER_SERVICE); 105db3556078a75be0bd4a08195d90f060724034e88Chung-yih Wang ViewGroup root = (ViewGroup) getRootView().findViewById(R.id.frame_layout); 106039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 1071e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li AbstractSettingPopup popup; 108c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li if (CameraSettings.KEY_VIDEO_EFFECT.equals(getKey())) { 1091e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li EffectSettingPopup effect = (EffectSettingPopup) inflater.inflate( 110c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li R.layout.effect_setting_popup, root, false); 1111e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li effect.initialize(mPreference); 1121e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li effect.setSettingChangedListener(this); 1131e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li mPopup = effect; 114c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li } else { 1151e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li BasicSettingPopup basic = (BasicSettingPopup) inflater.inflate( 116c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li R.layout.basic_setting_popup, root, false); 1171e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li basic.initialize(mPreference); 1181e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li basic.setSettingChangedListener(this); 1191e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li mPopup = basic; 120c0c662c5acaa5b76e1cb90a7868d16e471e2bd93Wu-cheng Li } 1211e99673af90451eaffeb100735f38e6ce0f18456Wu-cheng Li root.addView(mPopup); 122039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 123039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 1240341c03529f04351534a15d06facb096aab7a95fWu-cheng Li @Override 125039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void onSettingChanged() { 126039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li reloadPreference(); 1270341c03529f04351534a15d06facb096aab7a95fWu-cheng Li // Dismiss later so the activated state can be updated before dismiss. 1280341c03529f04351534a15d06facb096aab7a95fWu-cheng Li dismissPopupDelayed(); 129039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li if (mListener != null) { 130039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mListener.onSettingChanged(); 131039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 132039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 133f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li} 134