/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera.ui; import com.android.camera.CameraSettings; import com.android.camera.IconListPreference; import com.android.camera.R; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.ViewGroup; // An indicator button that represents one camera setting. Ex: flash. Pressing it opens a popup // window. public class IndicatorButton extends AbstractIndicatorButton implements BasicSettingPopup.Listener, EffectSettingPopup.Listener{ private final String TAG = "IndicatorButton"; private IconListPreference mPreference; // Scene mode can override the original preference value. private String mOverrideValue; private Listener mListener; static public interface Listener { public void onSettingChanged(); } public void setSettingChangedListener(Listener listener) { mListener = listener; } public IndicatorButton(Context context, IconListPreference pref) { super(context); mPreference = pref; reloadPreference(); } @Override public void reloadPreference() { int[] iconIds = mPreference.getLargeIconIds(); if (iconIds != null) { // Each entry has a corresponding icon. int index; if (mOverrideValue == null) { index = mPreference.findIndexOfValue(mPreference.getValue()); } else { index = mPreference.findIndexOfValue(mOverrideValue); if (index == -1) { // Avoid the crash if camera driver has bugs. Log.e(TAG, "Fail to find override value=" + mOverrideValue); mPreference.print(); return; } } setImageResource(iconIds[index]); } else { // The preference only has a single icon to represent it. setImageResource(mPreference.getSingleIcon()); } super.reloadPreference(); } public String getKey() { return mPreference.getKey(); } @Override public boolean isOverridden() { return mOverrideValue != null; } @Override public void overrideSettings(final String ... keyvalues) { mOverrideValue = null; for (int i = 0; i < keyvalues.length; i += 2) { String key = keyvalues[i]; String value = keyvalues[i + 1]; if (key.equals(getKey())) { mOverrideValue = value; setEnabled(value == null); break; } } reloadPreference(); } @Override protected void initializePopup() { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); ViewGroup root = (ViewGroup) getRootView().findViewById(R.id.frame_layout); AbstractSettingPopup popup; if (CameraSettings.KEY_VIDEO_EFFECT.equals(getKey())) { EffectSettingPopup effect = (EffectSettingPopup) inflater.inflate( R.layout.effect_setting_popup, root, false); effect.initialize(mPreference); effect.setSettingChangedListener(this); mPopup = effect; } else { BasicSettingPopup basic = (BasicSettingPopup) inflater.inflate( R.layout.basic_setting_popup, root, false); basic.initialize(mPreference); basic.setSettingChangedListener(this); mPopup = basic; } root.addView(mPopup); } @Override public void onSettingChanged() { reloadPreference(); // Dismiss later so the activated state can be updated before dismiss. dismissPopupDelayed(); if (mListener != null) { mListener.onSettingChanged(); } } }