1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.ui;
18 
19 import com.android.camera.CameraPreference.OnPreferenceChangedListener;
20 import com.android.camera.IconListPreference;
21 import com.android.camera.ListPreference;
22 import com.android.camera.PreferenceGroup;
23 import com.android.camera.CameraSettings;
24 import com.android.camera.R;
25 
26 import android.content.Context;
27 import android.util.AttributeSet;
28 import android.view.View;
29 import android.widget.ImageView;
30 import android.widget.RelativeLayout;
31 
32 import java.util.ArrayList;
33 
34 /**
35  * A view that contains camera setting indicators.
36  */
37 public abstract class IndicatorControl extends RelativeLayout implements
38         IndicatorButton.Listener, OtherSettingsPopup.Listener, Rotatable {
39     private static final String TAG = "IndicatorControl";
40     public static final int MODE_CAMERA = 0;
41     public static final int MODE_VIDEO = 1;
42 
43     private OnPreferenceChangedListener mListener;
44     protected OnIndicatorEventListener mOnIndicatorEventListener;
45     protected CameraPicker mCameraPicker;
46 
47     private PreferenceGroup mPreferenceGroup;
48     private int mOrientation = 0;
49 
50     protected int mCurrentMode = MODE_CAMERA;
51 
52     ArrayList<AbstractIndicatorButton> mIndicators =
53             new ArrayList<AbstractIndicatorButton>();
54 
setListener(OnPreferenceChangedListener listener)55     public void setListener(OnPreferenceChangedListener listener) {
56         mListener = listener;
57         if (mCameraPicker != null) mCameraPicker.setListener(listener);
58     }
59 
IndicatorControl(Context context, AttributeSet attrs)60     public IndicatorControl(Context context, AttributeSet attrs) {
61         super(context, attrs);
62     }
63 
setOrientation(int orientation)64     public void setOrientation(int orientation) {
65         mOrientation = orientation;
66         int count = getChildCount();
67         for (int i = 0 ; i < count ; ++i) {
68             View view = getChildAt(i);
69             if (view instanceof Rotatable) {
70                 ((Rotatable) view).setOrientation(orientation);
71             }
72         }
73     }
74 
setOnIndicatorEventListener(OnIndicatorEventListener listener)75     public void setOnIndicatorEventListener(OnIndicatorEventListener listener) {
76         mOnIndicatorEventListener = listener;
77     }
78 
setPreferenceGroup(PreferenceGroup group)79     public void setPreferenceGroup(PreferenceGroup group) {
80         mPreferenceGroup = group;
81         // Preset the current mode from the title of preference group.
82         String title = group.getTitle();
83         if (title.equals(getContext().getString(
84                 R.string.pref_camcorder_settings_category))) {
85             mCurrentMode = MODE_VIDEO;
86         }
87     }
88 
addControls(String[] keys, String[] otherSettingKeys)89     protected void addControls(String[] keys, String[] otherSettingKeys) {
90         if (keys != null) {
91             for (int i = 0; i < keys.length; i++) {
92                 IconListPreference pref =
93                         (IconListPreference) mPreferenceGroup.findPreference(keys[i]);
94                 if (pref != null) {
95                     addIndicator(getContext(), pref);
96                 }
97             }
98         }
99 
100         // Add other settings indicator.
101         if (otherSettingKeys != null) {
102             addOtherSettingIndicator(getContext(),
103                     R.drawable.ic_menu_overflow, otherSettingKeys);
104         }
105     }
106 
initializeCameraPicker()107     protected void initializeCameraPicker() {
108         ListPreference pref = mPreferenceGroup.findPreference(
109                 CameraSettings.KEY_CAMERA_ID);
110         if (pref == null) return;
111         mCameraPicker = new CameraPicker(getContext());
112         mCameraPicker.initialize(pref);
113         addView(mCameraPicker);
114     }
115 
116     @Override
shouldDelayChildPressedState()117     public boolean shouldDelayChildPressedState() {
118         // Return false so the pressed feedback of the back/front camera switch
119         // can be showed right away.
120         return false;
121     }
122 
addIndicator(Context context, IconListPreference pref)123     public IndicatorButton addIndicator(Context context, IconListPreference pref) {
124         IndicatorButton b = new IndicatorButton(context, pref);
125         b.setSettingChangedListener(this);
126         b.setContentDescription(pref.getTitle());
127         addView(b);
128         mIndicators.add(b);
129         return b;
130     }
131 
addOtherSettingIndicator(Context context, int resId, String[] keys)132     public OtherSettingIndicatorButton addOtherSettingIndicator(Context context,
133             int resId, String[] keys) {
134         OtherSettingIndicatorButton b = new OtherSettingIndicatorButton(
135                 context, resId, mPreferenceGroup, keys);
136         b.setSettingChangedListener(this);
137         b.setContentDescription(getResources().getString(
138                 R.string.pref_camera_settings_category));
139         addView(b);
140         mIndicators.add(b);
141         return b;
142     }
143 
144     @Override
onRestorePreferencesClicked()145     public void onRestorePreferencesClicked() {
146         if (mListener != null) {
147             mListener.onRestorePreferencesClicked();
148         }
149     }
150 
151     @Override
onSettingChanged()152     public void onSettingChanged() {
153         if (mListener != null) {
154             mListener.onSharedPreferenceChanged();
155         }
156     }
157 
dismissSettingPopup()158     public boolean dismissSettingPopup() {
159         for (AbstractIndicatorButton v: mIndicators) {
160             if (v.dismissPopup()) {
161                 invalidate();
162                 return true;
163             }
164         }
165         return false;
166     }
167 
getActiveSettingPopup()168     public View getActiveSettingPopup() {
169         for (AbstractIndicatorButton v: mIndicators) {
170             View result = v.getPopupWindow();
171             if (result != null) return result;
172         }
173         return null;
174     }
175 
176     // Scene mode may override other camera settings (ex: flash mode).
overrideSettings(final String ... keyvalues)177     public void overrideSettings(final String ... keyvalues) {
178         if (keyvalues.length % 2 != 0) {
179             throw new IllegalArgumentException();
180         }
181 
182         for (AbstractIndicatorButton b: mIndicators) {
183             b.overrideSettings(keyvalues);
184         }
185     }
186 
reloadPreferences()187     public void reloadPreferences() {
188         mPreferenceGroup.reloadValue();
189         for (AbstractIndicatorButton b: mIndicators) {
190             b.reloadPreference();
191         }
192     }
193 
194     @Override
setEnabled(boolean enabled)195     public void setEnabled(boolean enabled) {
196         super.setEnabled(enabled);
197         final int count = getChildCount();
198         for (int i = 0; i < count; i++) {
199             View v = getChildAt(i);
200             // Zoom buttons and shutter button are controlled by the activity.
201             if (v instanceof AbstractIndicatorButton) {
202                 v.setEnabled(enabled);
203                 // Show or hide the indicator buttons during recording.
204                 if (mCurrentMode == MODE_VIDEO) {
205                     v.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
206                 }
207             }
208         }
209         if (mCameraPicker != null) {
210             mCameraPicker.setEnabled(enabled);
211             if (mCurrentMode == MODE_VIDEO) {
212                 mCameraPicker.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
213             }
214         }
215     }
216 }
217