13984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu/*
23984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * Copyright (C) 2012 The Android Open Source Project
33984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu *
43984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * Licensed under the Apache License, Version 2.0 (the "License");
53984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * you may not use this file except in compliance with the License.
63984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * You may obtain a copy of the License at
73984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu *
83984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu *      http://www.apache.org/licenses/LICENSE-2.0
93984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu *
103984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * Unless required by applicable law or agreed to in writing, software
113984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * distributed under the License is distributed on an "AS IS" BASIS,
123984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * See the License for the specific language governing permissions and
143984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * limitations under the License.
153984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu */
163984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liupackage com.android.camera.ui;
173984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
183984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.content.Context;
193984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.content.res.Resources;
203984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.util.AttributeSet;
213984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.util.Log;
223984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.view.View;
233984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.Button;
243984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.CompoundButton;
253984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.NumberPicker;
26e687bdffc9ec121f6a24696aa2bf5d98d6416e49Doris Liuimport android.widget.Switch;
273984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport android.widget.TextView;
283984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
293984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport com.android.camera.IconListPreference;
30f04692066fc7087560248b003c49e0377c056edfDoris Liuimport com.android.camera.ListPreference;
313984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liuimport com.android.camera.R;
323984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
333984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu/**
343984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * This is a popup window that allows users to turn on/off time lapse feature,
353984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu * and to select a time interval for taking a time lapse video.
363984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu */
373984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liupublic class TimeIntervalPopup extends AbstractSettingPopup {
383984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private static final String TAG = "TimeIntervalPopup";
393984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private NumberPicker mNumberSpinner;
403984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private NumberPicker mUnitSpinner;
413984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private Switch mTimeLapseSwitch;
423984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private final String[] mUnits;
433984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private final String[] mDurations;
443984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private IconListPreference mPreference;
453984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private Listener mListener;
463984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private Button mConfirmButton;
473984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private TextView mHelpText;
483984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private View mTimePicker;
493984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
503984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    static public interface Listener {
51f04692066fc7087560248b003c49e0377c056edfDoris Liu        public void onListPrefChanged(ListPreference pref);
523984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
533984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
543984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    public void setSettingChangedListener(Listener listener) {
553984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mListener = listener;
563984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
573984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
583984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    public TimeIntervalPopup(Context context, AttributeSet attrs) {
593984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        super(context, attrs);
603984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
613984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        Resources res = context.getResources();
623984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnits = res.getStringArray(R.array.pref_video_time_lapse_frame_interval_units);
633984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mDurations = res
643984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu                .getStringArray(R.array.pref_video_time_lapse_frame_interval_duration_values);
653984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
663984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
673984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    public void initialize(IconListPreference preference) {
683984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mPreference = preference;
693984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
703984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        // Set title.
713984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mTitle.setText(mPreference.getTitle());
723984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
733984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        // Duration
743984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        int durationCount = mDurations.length;
753984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mNumberSpinner = (NumberPicker) findViewById(R.id.duration);
76e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu        mNumberSpinner.setMinValue(0);
77e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu        mNumberSpinner.setMaxValue(durationCount - 1);
783984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mNumberSpinner.setDisplayedValues(mDurations);
793984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mNumberSpinner.setWrapSelectorWheel(false);
803984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
813984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        // Units for duration (i.e. seconds, minutes, etc)
823984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnitSpinner = (NumberPicker) findViewById(R.id.duration_unit);
833984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnitSpinner.setMinValue(0);
843984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnitSpinner.setMaxValue(mUnits.length - 1);
853984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnitSpinner.setDisplayedValues(mUnits);
863984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnitSpinner.setWrapSelectorWheel(false);
873984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
883984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mTimePicker = findViewById(R.id.time_interval_picker);
893984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mTimeLapseSwitch = (Switch) findViewById(R.id.time_lapse_switch);
903984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mHelpText = (TextView) findViewById(R.id.set_time_interval_help_text);
913984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mConfirmButton = (Button) findViewById(R.id.time_lapse_interval_set_button);
923984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
933984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        // Disable focus on the spinners to prevent keyboard from coming up
943984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mNumberSpinner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
953984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mUnitSpinner.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
963984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
973984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mTimeLapseSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
98ccd32dfd9fe67daff7a428c4fc8fb5e67cfef906Doris Liu            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
993984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu                setTimeSelectionEnabled(isChecked);
1003984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            }
1013984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        });
1023984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mConfirmButton.setOnClickListener(new View.OnClickListener() {
1033984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            public void onClick(View v) {
1043984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu                updateInputState();
1053984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            }
1063984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        });
1073984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
1083984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
1093984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private void restoreSetting() {
1103984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        int index = mPreference.findIndexOfValue(mPreference.getValue());
1113984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        if (index == -1) {
1123984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            Log.e(TAG, "Invalid preference value.");
1133984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            mPreference.print();
1143984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            throw new IllegalArgumentException();
1153984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        } else if (index == 0) {
1163984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            // default choice: time lapse off
1173984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            mTimeLapseSwitch.setChecked(false);
1183984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            setTimeSelectionEnabled(false);
1193984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        } else {
1203984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            mTimeLapseSwitch.setChecked(true);
1213984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            setTimeSelectionEnabled(true);
122e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu            int durationCount = mNumberSpinner.getMaxValue() + 1;
123e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu            int unit = (index - 1) / durationCount;
124e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu            int number = (index - 1) % durationCount;
1253984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            mUnitSpinner.setValue(unit);
1263984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            mNumberSpinner.setValue(number);
1273984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        }
1283984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
1293984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
1303984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    @Override
1313984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    public void setVisibility(int visibility) {
1323984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        if (visibility == View.VISIBLE) {
1333984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            if (getVisibility() != View.VISIBLE) {
1343984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu                // Set the number pickers and on/off switch to be consistent
1353984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu                // with the preference
1363984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu                restoreSetting();
1373984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            }
1383984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        }
1393984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        super.setVisibility(visibility);
1403984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
1413984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
1423984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    protected void setTimeSelectionEnabled(boolean enabled) {
1433984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mHelpText.setVisibility(enabled ? GONE : VISIBLE);
1443984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        mTimePicker.setVisibility(enabled ? VISIBLE : GONE);
1453984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
1463984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
1473984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    @Override
1483984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    public void reloadPreference() {
1493984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
1503984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
1513984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    private void updateInputState() {
1523984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        if (mTimeLapseSwitch.isChecked()) {
153e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu            int newId = mUnitSpinner.getValue() * (mNumberSpinner.getMaxValue() + 1)
154e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu                    + mNumberSpinner.getValue() + 1;
155e1394085cca586c49dcff332b28d4c5d1aa43b8dDoris Liu            mPreference.setValueIndex(newId);
1563984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        } else {
1573984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu            mPreference.setValueIndex(0);
1583984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        }
1593984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu
1603984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        if (mListener != null) {
161f04692066fc7087560248b003c49e0377c056edfDoris Liu            mListener.onListPrefChanged(mPreference);
1623984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu        }
1633984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu    }
1643984a817e9a37a51aa6c6a07f62cb745379a8755Doris Liu}
165