125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb/* 225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Copyright (C) 2012 The Android Open Source Project 325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * 425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * you may not use this file except in compliance with the License. 625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * You may obtain a copy of the License at 725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * 825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * 1025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * Unless required by applicable law or agreed to in writing, software 1125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 1225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * See the License for the specific language governing permissions and 1425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb * limitations under the License. 1525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb */ 1625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 1725668cd6ed661c59295cb65348a126fb245757d4Michael Kolbpackage com.android.camera; 1825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 1925668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport android.content.Context; 2025668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport android.view.LayoutInflater; 2125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 2225668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.AbstractSettingPopup; 2325668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.ListPrefSettingPopup; 2425668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.MoreSettingPopup; 2525668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.PieItem; 2625668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.PieItem.OnClickListener; 2725668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.PieRenderer; 2825668cd6ed661c59295cb65348a126fb245757d4Michael Kolbimport com.android.camera.ui.TimeIntervalPopup; 29a3dc2c0dd75f4659146fcd257ce32acc3800ae5fJohn Reckimport com.android.gallery3d.R; 3025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 31b28942d44bcfcef145aece58545b07332a741c05Michael Kolbpublic class VideoMenu extends PieController 3225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb implements MoreSettingPopup.Listener, 3325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb ListPrefSettingPopup.Listener, 3425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb TimeIntervalPopup.Listener { 3525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 36ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private static String TAG = "CAM_VideoMenu"; 3725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 38ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu private VideoUI mUI; 3925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb private String[] mOtherKeys; 4025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb private AbstractSettingPopup mPopup; 4125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 4225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb private static final int POPUP_NONE = 0; 4325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb private static final int POPUP_FIRST_LEVEL = 1; 4425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb private static final int POPUP_SECOND_LEVEL = 2; 4525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb private int mPopupStatus; 46fb0636179335a7786ec2c0edf9889a55596db126Doris Liu private CameraActivity mActivity; 4725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 48ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu public VideoMenu(CameraActivity activity, VideoUI ui, PieRenderer pie) { 4925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb super(activity, pie); 50ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mUI = ui; 51fb0636179335a7786ec2c0edf9889a55596db126Doris Liu mActivity = activity; 5225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 5325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 5425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb public void initialize(PreferenceGroup group) { 5525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb super.initialize(group); 5625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopup = null; 5725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopupStatus = POPUP_NONE; 58cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi PieItem item = null; 59cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi // white balance 60cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi if (group.findPreference(CameraSettings.KEY_WHITE_BALANCE) != null) { 61ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb item = makeItem(CameraSettings.KEY_WHITE_BALANCE); 62cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi mRenderer.addItem(item); 63cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi } 64ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb // settings popup 65ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb mOtherKeys = new String[] { 66ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb CameraSettings.KEY_VIDEO_EFFECT, 67ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL, 68ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb CameraSettings.KEY_VIDEO_QUALITY, 69ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb CameraSettings.KEY_RECORD_LOCATION 70ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb }; 71ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb item = makeItem(R.drawable.ic_settings_holo_light); 72ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb item.setLabel(mActivity.getResources().getString(R.string.camera_menu_settings_label)); 73ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb item.setOnClickListener(new OnClickListener() { 74ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb @Override 75ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb public void onClick(PieItem item) { 76ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) { 77ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb initializePopup(); 78ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb mPopupStatus = POPUP_FIRST_LEVEL; 79ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb } 80ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb mUI.showPopup(mPopup); 81ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb } 82ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb }); 83ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb mRenderer.addItem(item); 84f79ef61a719d8edc9e76ddc00a6f667db2c363e4Michael Kolb // camera switcher 85cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi if (group.findPreference(CameraSettings.KEY_CAMERA_ID) != null) { 861c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb item = makeItem(R.drawable.ic_switch_back); 871c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb IconListPreference lpref = (IconListPreference) group.findPreference( 881c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb CameraSettings.KEY_CAMERA_ID); 893a9d84201ede2dbf150cce384a894924dc051dd1Michael Kolb item.setLabel(lpref.getLabel()); 901c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb item.setImageResource(mActivity, 911c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb ((IconListPreference) lpref).getIconIds() 921c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb [lpref.findIndexOfValue(lpref.getValue())]); 931c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb 943a9d84201ede2dbf150cce384a894924dc051dd1Michael Kolb final PieItem fitem = item; 95cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi item.setOnClickListener(new OnClickListener() { 9625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 97cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi @Override 98cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi public void onClick(PieItem item) { 99cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi // Find the index of next camera. 100cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi ListPreference pref = 101cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi mPreferenceGroup.findPreference(CameraSettings.KEY_CAMERA_ID); 102cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi if (pref != null) { 103cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi int index = pref.findIndexOfValue(pref.getValue()); 104cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi CharSequence[] values = pref.getEntryValues(); 105cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi index = (index + 1) % values.length; 106cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi int newCameraId = Integer.parseInt((String) values[index]); 1071c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb fitem.setImageResource(mActivity, 1081c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb ((IconListPreference) pref).getIconIds()[index]); 1093a9d84201ede2dbf150cce384a894924dc051dd1Michael Kolb fitem.setLabel(pref.getLabel()); 1101c7d2bc293a1ff824db768756d0309dfbc7f08d8Michael Kolb mListener.onCameraPickerClicked(newCameraId); 111cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi } 11225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 113cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi }); 114cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi mRenderer.addItem(item); 115cf184b00b0b9c261e147ab80dc4f5a18e10e3b4dJason Noguchi } 116ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb // flash 117ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb if (group.findPreference(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE) != null) { 118ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb item = makeItem(CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE); 119ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb mRenderer.addItem(item); 120ce8f6d1bb9dc52da7d168a94cb4c6f24d631d304Michael Kolb } 12125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 12225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 12325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb @Override 12425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb public void reloadPreferences() { 12525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb super.reloadPreferences(); 12625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mPopup != null) { 12725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopup.reloadPreference(); 12825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 12925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 13025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 13125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb @Override 13225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb public void overrideSettings(final String ... keyvalues) { 13325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb super.overrideSettings(keyvalues); 13425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mPopup == null || mPopupStatus != POPUP_FIRST_LEVEL) { 13525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopupStatus = POPUP_FIRST_LEVEL; 13625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb initializePopup(); 13725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 13825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb ((MoreSettingPopup) mPopup).overrideSettings(keyvalues); 13925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 14025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 14125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb @Override 14225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb // Hit when an item in the second-level popup gets selected 14325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb public void onListPrefChanged(ListPreference pref) { 14425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mPopup != null) { 14525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mPopupStatus == POPUP_SECOND_LEVEL) { 146ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mUI.dismissPopup(true); 14725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 14825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 14925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb super.onSettingChanged(pref); 15025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 15125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 15225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb protected void initializePopup() { 15325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService( 15425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb Context.LAYOUT_INFLATER_SERVICE); 15525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 15625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb MoreSettingPopup popup = (MoreSettingPopup) inflater.inflate( 15725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb R.layout.more_setting_popup, null, false); 15825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb popup.setSettingChangedListener(this); 15925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb popup.initialize(mPreferenceGroup, mOtherKeys); 16025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mActivity.isSecureCamera()) { 16125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb // Prevent location preference from getting changed in secure camera mode 16225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb popup.setPreferenceEnabled(CameraSettings.KEY_RECORD_LOCATION, false); 16325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 16425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopup = popup; 16525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 16625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 16725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb public void popupDismissed(boolean topPopupOnly) { 16825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb // if the 2nd level popup gets dismissed 16925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mPopupStatus == POPUP_SECOND_LEVEL) { 17025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb initializePopup(); 17125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopupStatus = POPUP_FIRST_LEVEL; 172ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu if (topPopupOnly) mUI.showPopup(mPopup); 17325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 17425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 17525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 17625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb @Override 17725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb // Hit when an item in the first-level popup gets selected, then bring up 17825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb // the second-level popup 17925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb public void onPreferenceClicked(ListPreference pref) { 18025668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (mPopupStatus != POPUP_FIRST_LEVEL) return; 18125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 18225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService( 18325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb Context.LAYOUT_INFLATER_SERVICE); 18425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 18525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb if (CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL.equals(pref.getKey())) { 18625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb TimeIntervalPopup timeInterval = (TimeIntervalPopup) inflater.inflate( 18725668cd6ed661c59295cb65348a126fb245757d4Michael Kolb R.layout.time_interval_popup, null, false); 18825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb timeInterval.initialize((IconListPreference) pref); 18925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb timeInterval.setSettingChangedListener(this); 190ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mUI.dismissPopup(true); 19125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopup = timeInterval; 19225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } else { 19325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb ListPrefSettingPopup basic = (ListPrefSettingPopup) inflater.inflate( 19425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb R.layout.list_pref_setting_popup, null, false); 19525668cd6ed661c59295cb65348a126fb245757d4Michael Kolb basic.initialize(pref); 19625668cd6ed661c59295cb65348a126fb245757d4Michael Kolb basic.setSettingChangedListener(this); 197ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mUI.dismissPopup(true); 19825668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopup = basic; 19925668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 200ea784b705602cdc424bab9b310ba21fdd95919ebDoris Liu mUI.showPopup(mPopup); 20125668cd6ed661c59295cb65348a126fb245757d4Michael Kolb mPopupStatus = POPUP_SECOND_LEVEL; 20225668cd6ed661c59295cb65348a126fb245757d4Michael Kolb } 20325668cd6ed661c59295cb65348a126fb245757d4Michael Kolb 20425668cd6ed661c59295cb65348a126fb245757d4Michael Kolb} 205