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.view.LayoutInflater;
     21 
     22 import com.android.camera.ui.AbstractSettingPopup;
     23 import com.android.camera.ui.ListPrefSettingPopup;
     24 import com.android.camera.ui.MoreSettingPopup;
     25 import com.android.camera.ui.PieItem;
     26 import com.android.camera.ui.PieItem.OnClickListener;
     27 import com.android.camera.ui.PieRenderer;
     28 import com.android.camera.ui.TimeIntervalPopup;
     29 
     30 public class VideoController extends PieController
     31         implements MoreSettingPopup.Listener,
     32         ListPrefSettingPopup.Listener,
     33         TimeIntervalPopup.Listener {
     34 
     35 
     36     private static String TAG = "CAM_videocontrol";
     37     private static float FLOAT_PI_DIVIDED_BY_TWO = (float) Math.PI / 2;
     38 
     39     private VideoModule mModule;
     40     private String[] mOtherKeys;
     41     private AbstractSettingPopup mPopup;
     42 
     43     private static final int POPUP_NONE = 0;
     44     private static final int POPUP_FIRST_LEVEL = 1;
     45     private static final int POPUP_SECOND_LEVEL = 2;
     46     private int mPopupStatus;
     47 
     48     public VideoController(CameraActivity activity, VideoModule module, PieRenderer pie) {
     49         super(activity, pie);
     50         mModule = module;
     51     }
     52 
     53     public void initialize(PreferenceGroup group) {
     54         super.initialize(group);
     55         mPopup = null;
     56         mPopupStatus = POPUP_NONE;
     57         float sweep = FLOAT_PI_DIVIDED_BY_TWO / 2;
     58 
     59         addItem(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE, FLOAT_PI_DIVIDED_BY_TWO - sweep, sweep);
     60         addItem(CameraSettings.KEY_WHITE_BALANCE, 3 * FLOAT_PI_DIVIDED_BY_TWO + sweep, sweep);
     61         PieItem item = makeItem(R.drawable.ic_switch_video_facing_holo_light);
     62         item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO + sweep,  sweep);
     63         item.setOnClickListener(new OnClickListener() {
     64 
     65             @Override
     66             public void onClick(PieItem item) {
     67                 // Find the index of next camera.
     68                 ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
     69                 if (pref != null) {
     70                     int index = pref.findIndexOfValue(pref.getValue());
     71                     CharSequence[] values = pref.getEntryValues();
     72                     index = (index + 1) % values.length;
     73                     int newCameraId = Integer.parseInt((String) values[index]);
     74                     mListener.onCameraPickerClicked(newCameraId);
     75                 }
     76             }
     77         });
     78         mRenderer.addItem(item);
     79         mOtherKeys = new String[] {
     80                 CameraSettings.KEY_VIDEO_EFFECT,
     81                 CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL,
     82                 CameraSettings.KEY_VIDEO_QUALITY,
     83                 CameraSettings.KEY_RECORD_LOCATION};
     84 
     85         item = makeItem(R.drawable.ic_settings_holo_light);
     86         item.setFixedSlice(FLOAT_PI_DIVIDED_BY_TWO * 3, sweep);
     87         item.setOnClickListener(new OnClickListener() {
     88             @Override
     89             public void onClick(PieItem item) {
     90                 if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) {
     91                     initializePopup();
     92                     mPopupStatus = POPUP_FIRST_LEVEL;
     93                 }
     94                 mModule.showPopup(mPopup);
     95             }
     96         });
     97         mRenderer.addItem(item);
     98     }
     99 
    100     protected void setCameraId(int cameraId) {
    101         ListPreference pref = mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID);
    102         pref.setValue("" + cameraId);
    103     }
    104 
    105     @Override
    106     public void reloadPreferences() {
    107         super.reloadPreferences();
    108         if (mPopup != null) {
    109             mPopup.reloadPreference();
    110         }
    111     }
    112 
    113     @Override
    114     public void overrideSettings(final String ... keyvalues) {
    115         super.overrideSettings(keyvalues);
    116         if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) {
    117             mPopupStatus = POPUP_FIRST_LEVEL;
    118             initializePopup();
    119         }
    120         ((MoreSettingPopup) mPopup).overrideSettings(keyvalues);
    121     }
    122 
    123     @Override
    124     // Hit when an item in the second-level popup gets selected
    125     public void onListPrefChanged(ListPreference pref) {
    126         if (mPopup != null) {
    127             if (mPopupStatus == POPUP_SECOND_LEVEL) {
    128                 mModule.dismissPopup(true);
    129             }
    130         }
    131         super.onSettingChanged(pref);
    132     }
    133 
    134     protected void initializePopup() {
    135         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
    136                 Context.LAYOUT_INFLATER_SERVICE);
    137 
    138         MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate(
    139                 R.layout.more_setting_popup, null, false);
    140         popup.setSettingChangedListener(this);
    141         popup.initialize(mPreferenceGroup, mOtherKeys);
    142         if (mActivity.isSecureCamera()) {
    143             // Prevent location preference from getting changed in secure camera mode
    144             popup.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION, false);
    145         }
    146         mPopup = popup;
    147     }
    148 
    149     public void popupDismissed(boolean topPopupOnly) {
    150         // if the 2nd level popup gets dismissed
    151         if (mPopupStatus == POPUP_SECOND_LEVEL) {
    152             initializePopup();
    153             mPopupStatus = POPUP_FIRST_LEVEL;
    154             if (topPopupOnly) mModule.showPopup(mPopup);
    155         }
    156     }
    157 
    158     @Override
    159     // Hit when an item in the first-level popup gets selected, then bring up
    160     // the second-level popup
    161     public void onPreferenceClicked(ListPreference pref) {
    162         if (mPopupStatus != POPUP_FIRST_LEVEL) return;
    163 
    164         LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(
    165                 Context.LAYOUT_INFLATER_SERVICE);
    166 
    167         if (CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL.equals(pref.getKey())) {
    168             TimeIntervalPopup timeInterval = (TimeIntervalPopup) inflater.inflate(
    169                     R.layout.time_interval_popup, null, false);
    170             timeInterval.initialize((IconListPreference) pref);
    171             timeInterval.setSettingChangedListener(this);
    172             mModule.dismissPopup(true);
    173             mPopup = timeInterval;
    174         } else {
    175             ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate(
    176                     R.layout.list_pref_setting_popup, null, false);
    177             basic.initialize(pref);
    178             basic.setSettingChangedListener(this);
    179             mModule.dismissPopup(true);
    180             mPopup = basic;
    181         }
    182         mModule.showPopup(mPopup);
    183         mPopupStatus = POPUP_SECOND_LEVEL;
    184     }
    185 
    186 }
    187