Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2012 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;
     18 
     19 import android.content.Context;
     20 import android.hardware.Camera.Parameters;
     21 import android.view.LayoutInflater;
     22 
     23 import com.android.camera.ui.AbstractSettingPopup;
     24 import com.android.camera.ui.ListPrefSettingPopup;
     25 import com.android.camera.ui.MoreSettingPopup;
     26 import com.android.camera.ui.PieItem;
     27 import com.android.camera.ui.PieItem.OnClickListener;
     28 import com.android.camera.ui.PieRenderer;
     29 import com.android.camera.ui.TimerSettingPopup;
     30 
     31 public class PhotoController extends PieController
     32         implements MoreSettingPopup.Listener,
     33         TimerSettingPopup.Listener,
     34         ListPrefSettingPopup.Listener {
     35     private static String TAG = "CAM_photocontrol";
     36     private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2;
     37     private final String mSettingOff;
     38 
     39     private PhotoModule mModule;
     40     private String[] mOtherKeys;
     41     // First level popup
     42     private MoreSettingPopup mPopup;
     43     // Second level popup
     44     private AbstractSettingPopup mSecondPopup;
     45 
     46     public PhotoController(CameraActivity activity, PhotoModule module, PieRenderer pie) {
     47         super(activity, pie);
     48         mModule = module;
     49         mSettingOff = activity.getString(R.string.setting_off_value);
     50     }
     51 
     52     public void initialize(PreferenceGroup group) {
     53         super.initialize(group);
     54         mPopup = null;
     55         mSecondPopup = null;
     56         float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2;
     57         addItem(CameraSettings.KEY_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
     58         addItem(CameraSettings.KEY_EXPOSURE, 3 * FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
     59         addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep);
     60         if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) {
     61             PieItem item = makeItem(R.drawable.ic_switch_photo_facing_holo_light);
     62             item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep);
     63             item.setOnClickListener(new OnClickListener() {
     64                 @Override
     65                 public void onClick(PieItem item) {
     66                     // Find the index of next camera.
     67                     ListPreference camPref = mPreferenceGroup
     68                             .findPreference(CameraSettings.KEY_CAMERA_ID);
     69                     if (camPref != null) {
     70                         int index = camPref.findIndexOfValue(camPref.getValue());
     71                         CharSequence[] values = camPref.getEntryValues();
     72                         index = (index + 1) % values.length;
     73                         int newCameraId = Integer
     74                                 .parseInt((String) values[index]);
     75                         mListener.onCameraPickerClicked(newCameraId);
     76                     }
     77                 }
     78             });
     79             mRenderer.addItem(item);
     80         }
     81         if (group.findPreference(CameraSettings.KEY_CAMERA_HDR) != null) {
     82             PieItem hdr = makeItem(R.drawable.ic_hdr);
     83             hdr.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO, sweep);
     84             hdr.setOnClickListener(new OnClickListener() {
     85                 @Override
     86                 public void onClick(PieItem item) {
     87                     // Find the index of next camera.
     88                     ListPreference pref = mPreferenceGroup
     89                             .findPreference(CameraSettings.KEY_CAMERA_HDR);
     90                     if (pref != null) {
     91                         // toggle hdr value
     92                         int index = (pref.findIndexOfValue(pref.getValue()) + 1) % 2;
     93                         pref.setValueIndex(index);
     94                         onSettingChanged(pref);
     95                     }
     96                 }
     97             });
     98             mRenderer.addItem(hdr);
     99         }
    100         mOtherKeys = new String[] {
    101                 CameraSettings.KEY_SCENE_MODE,
    102                 CameraSettings.KEY_RECORD_LOCATION,
    103                 CameraSettings.KEY_PICTURE_SIZE,
    104                 CameraSettings.KEY_FOCUS_MODE,
    105                 CameraSettings.KEY_TIMER,
    106                 CameraSettings.KEY_TIMER_SOUND_EFFECTS,
    107                 };
    108         PieItem item = makeItem(R.drawable.ic_settings_holo_light);
    109         item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep);
    110         item.setOnClickListener(new OnClickListener() {
    111             @Override
    112             public void onClick(PieItem item) {
    113                 if (mPopup == null) {
    114                     initializePopup();
    115                 }
    116                 mModule.showPopup(mPopup);
    117             }
    118         });
    119         mRenderer.addItem(item);
    120     }
    121 
    122     protected void setCameraId(int cameraId) {
    123         ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
    124         pref.setValue("" + cameraId);
    125     }
    126 
    127     @Override
    128     public void reloadPreferences() {
    129         super.reloadPreferences();
    130         if (mPopup != null) {
    131             mPopup.reloadPreference();
    132         }
    133     }
    134 
    135     @Override
    136     // Hit when an item in the second-level popup gets selected
    137     public void onListPrefChanged(ListPreference pref) {
    138         if (mPopup != null && mSecondPopup != null) {
    139                 mModule.dismissPopup(true);
    140                 mPopup.reloadPreference();
    141         }
    142         onSettingChanged(pref);
    143     }
    144 
    145     @Override
    146     public void overrideSettings(final String ... keyvalues) {
    147         super.overrideSettings(keyvalues);
    148         if (mPopup == null) initializePopup();
    149         mPopup.overrideSettings(keyvalues);
    150     }
    151 
    152     protected void initializePopup() {
    153         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
    154                 Context.LAYOUT_INFLATER_SERVICE);
    155 
    156         MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate(
    157                 R.layout.more_setting_popup, null, false);
    158         popup.setSettingChangedListener(this);
    159         popup.initialize(mPreferenceGroup, mOtherKeys);
    160         if (mActivity.isSecureCamera()) {
    161             // Prevent location preference from getting changed in secure camera mode
    162             popup.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION, false);
    163         }
    164         mPopup = popup;
    165     }
    166 
    167     public void popupDismissed(boolean topPopupOnly) {
    168         // if the 2nd level popup gets dismissed
    169         if (mSecondPopup != null) {
    170             mSecondPopup = null;
    171             if (topPopupOnly) mModule.showPopup(mPopup);
    172         }
    173     }
    174 
    175     // Return true if the preference has the specified key but not the value.
    176     private static boolean notSame(ListPreference pref, String key, String value) {
    177         return (key.equals(pref.getKey()) && !value.equals(pref.getValue()));
    178     }
    179 
    180     private void setPreference(String key, String value) {
    181         ListPreference pref = mPreferenceGroup.findPreference(key);
    182         if (pref != null && !value.equals(pref.getValue())) {
    183             pref.setValue(value);
    184             reloadPreferences();
    185         }
    186     }
    187 
    188     @Override
    189     public void onSettingChanged(ListPreference pref) {
    190         // Reset the scene mode if HDR is set to on. Reset HDR if scene mode is
    191         // set to non-auto.
    192         if (notSame(pref, CameraSettings.KEY_CAMERA_HDR, mSettingOff)) {
    193             setPreference(CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO);
    194         } else if (notSame(pref, CameraSettings.KEY_SCENE_MODE, Parameters.SCENE_MODE_AUTO)) {
    195             setPreference(CameraSettings.KEY_CAMERA_HDR, mSettingOff);
    196         }
    197         super.onSettingChanged(pref);
    198     }
    199 
    200     @Override
    201     // Hit when an item in the first-level popup gets selected, then bring up
    202     // the second-level popup
    203     public void onPreferenceClicked(ListPreference pref) {
    204         if (mSecondPopup != null) return;
    205 
    206         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
    207                 Context.LAYOUT_INFLATER_SERVICE);
    208         if (CameraSettings.KEY_TIMER.equals(pref.getKey())) {
    209             TimerSettingPopup timerPopup = (TimerSettingPopup) inflater.inflate(
    210                     R.layout.timer_setting_popup, null, false);
    211             timerPopup.initialize(pref);
    212             timerPopup.setSettingChangedListener(this);
    213             mModule.dismissPopup(true);
    214             mSecondPopup = timerPopup;
    215         } else {
    216             ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate(
    217                     R.layout.list_pref_setting_popup, null, false);
    218             basic.initialize(pref);
    219             basic.setSettingChangedListener(this);
    220             mModule.dismissPopup(true);
    221             mSecondPopup = basic;
    222         }
    223         mModule.showPopup(mSecondPopup);
    224     }
    225 }
    226