/* * Copyright (C) 2011 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.CameraPreference.OnPreferenceChangedListener; import com.android.camera.IconListPreference; import com.android.camera.ListPreference; import com.android.camera.PreferenceGroup; import com.android.camera.CameraSettings; import com.android.camera.R; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import java.util.ArrayList; /** * A view that contains camera setting indicators. */ public abstract class IndicatorControl extends RelativeLayout implements IndicatorButton.Listener, OtherSettingsPopup.Listener, Rotatable { private static final String TAG = "IndicatorControl"; public static final int MODE_CAMERA = 0; public static final int MODE_VIDEO = 1; private OnPreferenceChangedListener mListener; protected OnIndicatorEventListener mOnIndicatorEventListener; protected CameraPicker mCameraPicker; private PreferenceGroup mPreferenceGroup; private int mOrientation = 0; protected int mCurrentMode = MODE_CAMERA; ArrayList<AbstractIndicatorButton> mIndicators = new ArrayList<AbstractIndicatorButton>(); public void setListener(OnPreferenceChangedListener listener) { mListener = listener; if (mCameraPicker != null) mCameraPicker.setListener(listener); } public IndicatorControl(Context context, AttributeSet attrs) { super(context, attrs); } public void setOrientation(int orientation) { mOrientation = orientation; int count = getChildCount(); for (int i = 0 ; i < count ; ++i) { View view = getChildAt(i); if (view instanceof Rotatable) { ((Rotatable) view).setOrientation(orientation); } } } public void setOnIndicatorEventListener(OnIndicatorEventListener listener) { mOnIndicatorEventListener = listener; } public void setPreferenceGroup(PreferenceGroup group) { mPreferenceGroup = group; // Preset the current mode from the title of preference group. String title = group.getTitle(); if (title.equals(getContext().getString( R.string.pref_camcorder_settings_category))) { mCurrentMode = MODE_VIDEO; } } protected void addControls(String[] keys, String[] otherSettingKeys) { if (keys != null) { for (int i = 0; i < keys.length; i++) { IconListPreference pref = (IconListPreference) mPreferenceGroup.findPreference(keys[i]); if (pref != null) { addIndicator(getContext(), pref); } } } // Add other settings indicator. if (otherSettingKeys != null) { addOtherSettingIndicator(getContext(), R.drawable.ic_menu_overflow, otherSettingKeys); } } protected void initializeCameraPicker() { ListPreference pref = mPreferenceGroup.findPreference( CameraSettings.KEY_CAMERA_ID); if (pref == null) return; mCameraPicker = new CameraPicker(getContext()); mCameraPicker.initialize(pref); addView(mCameraPicker); } @Override public boolean shouldDelayChildPressedState() { // Return false so the pressed feedback of the back/front camera switch // can be showed right away. return false; } public IndicatorButton addIndicator(Context context, IconListPreference pref) { IndicatorButton b = new IndicatorButton(context, pref); b.setSettingChangedListener(this); b.setContentDescription(pref.getTitle()); addView(b); mIndicators.add(b); return b; } public OtherSettingIndicatorButton addOtherSettingIndicator(Context context, int resId, String[] keys) { OtherSettingIndicatorButton b = new OtherSettingIndicatorButton( context, resId, mPreferenceGroup, keys); b.setSettingChangedListener(this); b.setContentDescription(getResources().getString( R.string.pref_camera_settings_category)); addView(b); mIndicators.add(b); return b; } @Override public void onRestorePreferencesClicked() { if (mListener != null) { mListener.onRestorePreferencesClicked(); } } @Override public void onSettingChanged() { if (mListener != null) { mListener.onSharedPreferenceChanged(); } } public boolean dismissSettingPopup() { for (AbstractIndicatorButton v: mIndicators) { if (v.dismissPopup()) { invalidate(); return true; } } return false; } public View getActiveSettingPopup() { for (AbstractIndicatorButton v: mIndicators) { View result = v.getPopupWindow(); if (result != null) return result; } return null; } // Scene mode may override other camera settings (ex: flash mode). public void overrideSettings(final String ... keyvalues) { if (keyvalues.length % 2 != 0) { throw new IllegalArgumentException(); } for (AbstractIndicatorButton b: mIndicators) { b.overrideSettings(keyvalues); } } public void reloadPreferences() { mPreferenceGroup.reloadValue(); for (AbstractIndicatorButton b: mIndicators) { b.reloadPreference(); } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); final int count = getChildCount(); for (int i = 0; i < count; i++) { View v = getChildAt(i); // Zoom buttons and shutter button are controlled by the activity. if (v instanceof AbstractIndicatorButton) { v.setEnabled(enabled); // Show or hide the indicator buttons during recording. if (mCurrentMode == MODE_VIDEO) { v.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE); } } } if (mCameraPicker != null) { mCameraPicker.setEnabled(enabled); if (mCurrentMode == MODE_VIDEO) { mCameraPicker.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE); } } } }