IndicatorButton.java revision db3556078a75be0bd4a08195d90f060724034e88
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 19f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport com.android.camera.IconListPreference; 20039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport com.android.camera.R; 21f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 22f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Liimport android.content.Context; 23d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Liimport android.util.Log; 24039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.LayoutInflater; 25039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.ViewGroup; 26f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 27039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// An indicator button that represents one camera setting. Ex: flash. Pressing it opens a popup 28039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// window. 29039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Lipublic class IndicatorButton extends AbstractIndicatorButton implements BasicSettingPopup.Listener { 30d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li private final String TAG = "IndicatorButton"; 31f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li private IconListPreference mPreference; 32823d57389b616091827059ca6401f675e416a53bWu-cheng Li // Scene mode can override the original preference value. 33823d57389b616091827059ca6401f675e416a53bWu-cheng Li private String mOverrideValue; 34039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li private Listener mListener; 35039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 36039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li static public interface Listener { 37039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void onSettingChanged(); 38039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 39039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 40039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void setSettingChangedListener(Listener listener) { 41039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mListener = listener; 42039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 43f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 44f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li public IndicatorButton(Context context, IconListPreference pref) { 45f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li super(context); 46f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li mPreference = pref; 47f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li reloadPreference(); 48f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li } 49f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li 504cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang @Override 51f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li public void reloadPreference() { 52e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li int[] iconIds = mPreference.getLargeIconIds(); 53e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li if (iconIds != null) { 54e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li // Each entry has a corresponding icon. 55823d57389b616091827059ca6401f675e416a53bWu-cheng Li int index; 56823d57389b616091827059ca6401f675e416a53bWu-cheng Li if (mOverrideValue == null) { 57823d57389b616091827059ca6401f675e416a53bWu-cheng Li index = mPreference.findIndexOfValue(mPreference.getValue()); 58823d57389b616091827059ca6401f675e416a53bWu-cheng Li } else { 59823d57389b616091827059ca6401f675e416a53bWu-cheng Li index = mPreference.findIndexOfValue(mOverrideValue); 60d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li if (index == -1) { 61d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li // Avoid the crash if camera driver has bugs. 62d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li Log.e(TAG, "Fail to find override value=" + mOverrideValue); 63d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li mPreference.print(); 64d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li return; 65d456809fe6646db9ed759ecc6457f9280d18f2a6Wu-cheng Li } 66823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 67d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan setImageResource(iconIds[index]); 68e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li } else { 69e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li // The preference only has a single icon to represent it. 70d09139b23bc06f8e0ecb90dd4048ab9ee374c253Hung-ying Tyan setImageResource(mPreference.getSingleIcon()); 71e747919853dfcbe29969647d7bf83269056d77bcWu-cheng Li } 724cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang super.reloadPreference(); 73f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li } 74823d57389b616091827059ca6401f675e416a53bWu-cheng Li 75823d57389b616091827059ca6401f675e416a53bWu-cheng Li public String getKey() { 76823d57389b616091827059ca6401f675e416a53bWu-cheng Li return mPreference.getKey(); 77823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 78823d57389b616091827059ca6401f675e416a53bWu-cheng Li 79039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li @Override 80823d57389b616091827059ca6401f675e416a53bWu-cheng Li public boolean isOverridden() { 81823d57389b616091827059ca6401f675e416a53bWu-cheng Li return mOverrideValue != null; 82823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 83823d57389b616091827059ca6401f675e416a53bWu-cheng Li 84039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li @Override 85039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void overrideSettings(final String ... keyvalues) { 86039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mOverrideValue = null; 87039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li for (int i = 0; i < keyvalues.length; i += 2) { 88039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li String key = keyvalues[i]; 89039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li String value = keyvalues[i + 1]; 90039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li if (key.equals(getKey())) { 91039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mOverrideValue = value; 92039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li setEnabled(value == null); 93039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li break; 94039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 95039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 96823d57389b616091827059ca6401f675e416a53bWu-cheng Li reloadPreference(); 97823d57389b616091827059ca6401f675e416a53bWu-cheng Li } 98039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 99039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li @Override 100039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li protected void initializePopup() { 101039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( 102039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li Context.LAYOUT_INFLATER_SERVICE); 103db3556078a75be0bd4a08195d90f060724034e88Chung-yih Wang ViewGroup root = (ViewGroup) getRootView().findViewById(R.id.frame_layout); 104039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 105039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li BasicSettingPopup popup = (BasicSettingPopup) inflater.inflate( 106039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li R.layout.basic_setting_popup, root, false); 107039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li popup.setSettingChangedListener(this); 108039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li popup.initialize(mPreference); 109039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li root.addView(popup); 110039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mPopup = popup; 111039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 112039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li 1130341c03529f04351534a15d06facb096aab7a95fWu-cheng Li @Override 114039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li public void onSettingChanged() { 115039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li reloadPreference(); 1160341c03529f04351534a15d06facb096aab7a95fWu-cheng Li // Dismiss later so the activated state can be updated before dismiss. 1170341c03529f04351534a15d06facb096aab7a95fWu-cheng Li dismissPopupDelayed(); 118039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li if (mListener != null) { 119039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li mListener.onSettingChanged(); 120039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 121039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li } 122f5bffc476b8293b30bb500bed2ab7914bb4ca411Wu-cheng Li} 123