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